如何将404错误redirect到ExpressJS中的页面?
我不知道这样做的function,有人知道吗?
我发现这个例子相当有帮助:
visionmedia/express/blob/master/examples/error-pages/index.html
所以实际上是这个部分:
// "app.router" positions our routes // above the middleware defined below, // this means that Express will attempt // to match & call routes _before_ continuing // on, at which point we assume it's a 404 because // no route has handled the request. app.use(app.router); // Since this is the last non-error-handling // middleware use()d, we assume 404, as nothing else // responded. // $ curl http://localhost:3000/notfound // $ curl http://localhost:3000/notfound -H "Accept: application/json" // $ curl http://localhost:3000/notfound -H "Accept: text/plain" app.use(function(req, res, next){ res.status(404); // respond with html page if (req.accepts('html')) { res.render('404', { url: req.url }); return; } // respond with json if (req.accepts('json')) { res.send({ error: 'Not found' }); return; } // default to plain-text. send() res.type('txt').send('Not found'); });
我想你应该首先定义所有的路线,并作为最后的路线添加
//The 404 Route (ALWAYS Keep this as the last route) app.get('*', function(req, res){ res.send('what???', 404); });
一个可以工作的示例应用程序:
app.js:
var express = require('express'), app = express.createServer(); app.use(express.static(__dirname + '/public')); app.get('/', function(req, res){ res.send('hello world'); }); //The 404 Route (ALWAYS Keep this as the last route) app.get('*', function(req, res){ res.send('what???', 404); }); app.listen(3000, '127.0.0.1');
alfred@alfred-laptop:~/node/stackoverflow/6528876$ mkdir public alfred@alfred-laptop:~/node/stackoverflow/6528876$ find . alfred@alfred-laptop:~/node/stackoverflow/6528876$ echo "I don't find a function for that... Anyone knows?" > public/README.txt alfred@alfred-laptop:~/node/stackoverflow/6528876$ cat public/README.txt . ./app.js ./public ./public/README.txt alfred@alfred-laptop:~/node/stackoverflow/6528876$ curl http://localhost:3000/ hello world alfred@alfred-laptop:~/node/stackoverflow/6528876$ curl http://localhost:3000/README.txt I don't find a function for that... Anyone knows?
您可以将中间件放在引发NotFound
错误的最后位置,
甚至直接呈现404页面:
app.use(function(req,res){ res.render('404.jade'); });
上面的答案是好的,但其中一半你不会得到404作为您的HTTP状态代码返回,另一半,你将无法自定义模板渲染。 在Expressjs中有一个自定义错误页面(404's)的最好方法是
app.use(function(req, res, next){ res.status(404).render('404_error_template', {title: "Sorry, page not found"}); });
将此代码放在所有有效的存在URL映射的末尾。
你的问题的答案是:
app.use(function(req, res) { res.status(404).end('error'); });
有一篇关于为什么这里是最好的方法的伟大的文章。
在app.js的最后一行只是把这个函数。 这将覆盖默认的页面未find的错误页面:
app.use(function (req, res) { res.render('error'); });
它将覆盖所有没有有效处理程序的请求,并呈现您自己的错误页面。
expressionerror handling程序让您指定自定义模板,静态页面或error handling程序为您的错误。 它也做其他有用的error handling的东西,每个应用程序应该实现,如防止4xx错误DOS攻击,并正常关机不可恢复的错误。 以下是你如何做你所要求的:
var errorHandler = require('express-error-handler'), handler = errorHandler({ static: { '404': 'path/to/static/404.html' } }); // After all your routes... // Pass a 404 into next(err) app.use( errorHandler.httpError(404) ); // Handle all unhandled errors: app.use( handler );
或者为自定义处理程序:
handler = errorHandler({ handlers: { '404': function err404() { // do some custom thing here... } } });
或者对于自定义视图:
handler = errorHandler({ views: { '404': '404.jade' } });
// Add this middleware // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); });
虽然上面的答案是正确的,对于那些想在IISNODE中得到这个工作的人,你也需要指定
<configuration> <system.webServer> <httpErrors existingResponse="PassThrough"/> </system.webServer> <configuration>
在你的web.config(否则IIS会吃你的输出)。
在某些情况下,404页面不能作为最后一个路由被执行,特别是如果你有一个asynchronous路由function,导致晚到晚会。 在这些情况下,可能会采用下面的模式。
var express = require("express.io"), app = express(), router = express.Router(); router.get("/hello", function (req, res) { res.send("Hello World"); }); // Router is up here. app.use(router); app.use(function(req, res) { res.send("Crime Scene 404. Do not repeat"); }); router.get("/late", function (req, res) { res.send("Its OK to come late"); }); app.listen(8080, function (){ console.log("Ready"); });
如果你使用快递发电机组:
下一个(ERR);
此代码将您发送到404中间件。
我用下面的处理程序来处理一个静态的.ejs
文件的404错误。
把这段代码放在一个路由脚本中,然后通过app.use()
在你的app.js
/ server.js
/ www.js
(如果使用IntelliJ for app.use()
中需要这个app.use()
您也可以使用静态的.html
文件。
//Unknown route handler router.get("[otherRoute]", function(request, response) { response.status(404); response.render("error404.[ejs]/[html]"); response.end(); });
这样,正在运行的express服务器将会响应一个正确的404 error
,您的网站也可以包含一个正确显示服务器404响应的页面。 您也可以在404 error template
中包含一个navbar
,链接到您网站的其他重要内容。
app.get('*',function(req,res){ res.redirect('/login'); });
您可以根据内容types进行error handling
此外,根据状态代码处理。
app.js
import express from 'express'; // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // when status is 404, error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); if( 404 === err.status ){ res.format({ 'text/plain': () => { res.send({message: 'not found Data'}); }, 'text/html': () => { res.render('404.jade'); }, 'application/json': () => { res.send({message: 'not found Data'}); }, 'default': () => { res.status(406).send('Not Acceptable'); } }) } // when status is 500, error handler if(500 === err.status) { return res.send({message: 'error occur'}); } });
404.jade
doctype html html head title 404 Not Found meta(http-equiv="Content-Type" content="text/html; charset=utf-8") meta(name = "viewport" content="width=device-width, initial-scale=1.0 user-scalable=no") body h2 Not Found Page h2 404 Error Code
如果你可以使用res.format,你可以编写简单的error handling代码。
build议使用res.format()
而不是res.accepts()
。
如果在前面的代码中发生500错误, if(500 == err.status){. . . }
if(500 == err.status){. . . }
if(500 == err.status){. . . }
被调用
发送到自定义页面:
app.get('*', function(req, res){ if (req.accepts('html')) { res.send('404', '<script>location.href = "/the-404-page.html";</script>'); return; } });