如何将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; } });