我想知道如果我在expressjs中写下会发生什么(我们假设 app 是一个快速应用程序)。
app.get.use('/here' , function(req, res) {
// EXECUTE SET OF ACTION NUMBER 1
});
app.get.use('/here' , function(req, res) {
// EXECUTE SET OF ACTION NUMBER 2
})
我们两次写相同的路线,但行动不同。第二个声明会超载第一个吗?
答案 0 :(得分:6)
这取决于回调函数中发生的事情。考虑三个不同的例子:
A)
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
console.log('1!');
res.json(true);
});
app.get('/', (req, res) => {
console.log('2!');
res.json(true);
});
app.listen(3000);
b)中
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
console.log('1!');
});
app.get('/', (req, res) => {
console.log('2!');
res.json(true);
});
app.listen(3000);
c)中
const express = require('express');
const app = express();
app.get('/', (req, res, next) => {
console.log('1!');
next();
});
app.get('/', (req, res) => {
console.log('2!');
res.json(true);
});
app.listen(3000);
在(a)案例中,工作流程是自上而下的。第一个路由处理程序启动,console.logs“1!”并以true
回复。由于已发送完整响应,因此永远不会到达以下路由处理程序。
在(b)的情况下,执行在第一个路由处理程序停止。它既不响应也不允许执行更进一步。如果你curl
这个应用程序,你最终会得到请求超时,虽然你会看到“1!”在控制台上。
最后,在(c)的情况下,您可以看到next
函数调用。这使得Express继续执行并转到下一个路由处理程序(如果有的话)。由于还有另一个路由处理程序,它会被执行,所以你最终得到“1!”和“2!”打印在控制台上,以及正确发送的响应。
这里有几点:
next
如果你期望另一个路由处理程序在当前的之后运行,当你编写一个中间件或者像你的情况一样,你是一个类似“中间件”的应用程序时,这一点尤为重要可能会添加到另一个应用程序,