我是node.js和express.js的新手,并且正在练习服务器创建的基础知识。我发现,如果我在app.use之后编写app.get,那么该代码将无法正常工作。
我尝试搜索“为什么app.use express.js 404”的各种组合,但一无所获。
const express = require('express');
const app = express();
// 1) Add a route that answers to all request types
app.route('/article')
.get(function(req, res) {
res.send('Get the article');
})
.post(function(req, res) {
res.send('Add an article');
})
.put(function(req, res) {
res.send('Update the article');
});
// on the request to root (localhost:3000/)
app.get('/', function (req, res) {
res.send('<b>My</b> first express http server');
});
// 3) Use regular expressions in routes
// responds to : batmobile, batwing, batcave, batarang
app.get(/bat/, function(req, res) {
res.send('/bat/');
});
// 2) Use a wildcard for a route
// answers to : theANYman, thebatman, thesuperman
app.get('/the*man', function(req, res) {
res.send('the*man');
});
// app.get does NOT return anything thats defined beyond this method call
app.use(function(req, res, next) {
res.status(404).send("Sorry, that route doesn't exist. Have a nice day :)");
});
// this will not be work unless moved above app.use
app.get('/welcome', function (req, res) {
res.send('<b>Hello</b> welcome to my http server made with express');
});
app.listen(3000, function () {
console.log('Example app listening on port 3000.');
});
答案 0 :(得分:1)
按照定义的顺序检查路由处理程序的路径是否匹配。
定义后:
app.use(function(req, res, next) {
res.status(404).send("Sorry, that route doesn't exist. Have a nice day :)");
});
响应已发送,尚未调用next()
,因此不会再调用链中的路由处理程序。
您的404路由处理程序应该是最后定义的路由处理程序。这个想法是,如果没有其他路由处理程序处理过此请求,则您必须没有一个,并且它必须是您应为其返回404的路由。但是,您只能知道,如果将此请求放在链的最后(从而将它定义为最后,使其在链的最后),那么其他路由处理程序将不会处理该请求。
为进一步说明,每次您执行app.use()
,app.post()
或app.get()
或该系列中的任何其他操作时,都会向内部路由数组添加路由处理程序,并添加按照代码运行的顺序将它们放入该数组。注册的第一个路径在数组的开头,最后一个在数组的末尾。
当请求进入时,Express从该数组的开头开始,并寻找与传入请求的路径和类型匹配的第一个处理程序,并调用该路由处理程序。
如果该路由处理程序从不调用next()
,则不再为该请求调用任何路由处理程序。完成。如果该路由处理程序调用{{1}},则Express会继续在数组中查找下一个匹配的路由处理程序。
因此,您可以看到next()
404处理程序从不调用app.use()
,因此Express永远不会继续为该请求寻找更多匹配的路由处理程序,因此在此之后声明的路由处理程序将从来没有找到,也从未打电话过。