我正在学习节点js应用程序,我想知道我的app.use(404和500错误)和我app.get(/)路由的控制器路由的错误处理程序的顺序是否重要?
https://www.w3schools.com/nodejs/ https://www.tutorialspoint.com/nodejs/index.htm
这是我的app.js
//**** DEPENDENCIES ****//
const express = require('express');
const app = express();
//use the express handlebars
const exphbs = require('express-handlebars');
app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');
const index = require('./controllers/index');
const fetch = require('node-fetch');
//**** MIDDLEWARE ****//
// static files will live in the public folder
app.use(express.static('public'));
// **** CONTROLLERS **** //
// separate the route from the app.js to make it cleaner
require('./controllers/index.js')(app);
//app.get('/', index)
// catch 404 and forward to error handler
app.use((req, res, next) => {
const err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handler
app.use(function(err, req, res, next) {
if(err.status == 404) {
res.status(err.status || 404);
res.render('error', {err : err.status, message: "Sorry We Can't Help You", stack: err.stack });
} else if (err.status == 500) {
console.log(500);
// render the error page
res.status(err.status || 500);
res.render('error', {err : err.status});
// res.redirect('/500.html');
}
});
// **** Local server Port **** //
var PORT = process.env.PORT || 3000;
app.listen(PORT, function(req, res) {
console.log("Express App listening on port " + PORT + "...");
});
答案 0 :(得分:1)
是的,虽然我在快递文档中找不到它。路由匹配算法按顺序查看并按顺序执行每个匹配,直到一个调用res.end()(通常通过其他方法,如res.render()和res.send())
答案 1 :(得分:1)
在您的特定情况下,订单确实很重要,因为您在404处理程序中调用了next(err)
,并且您希望自定义错误路由处理程序获取该顺序,并且它是获取该next(err)
的唯一方法是为了它后来。如果您颠倒了顺序,那么您最终只能使用Express中的默认错误处理程序,而不是您自己的自定义错误处理程序。
所以,对于你编写代码的方式,你有正确的顺序,反向顺序不会做你想要的。