Javascript 使用next()的执行流
我是新来表达的,对next()函数的机制有一个疑问Javascript 使用next()的执行流,javascript,express,routing,middleware,Javascript,Express,Routing,Middleware,我是新来表达的,对next()函数的机制有一个疑问 调用next()后,它会立即触发app.get的执行,而next()下面的所有内容都将异步执行,这对吗 如果是这样的话,为什么我在setTimeout()中设置了很大的延迟后,就不会将“我被执行了吗?”打印到控制台 请在下面的代码中解释执行流程 app.param('seriesId', (req, res, next) => { ... // Check for presence of series console.log('I
app.param('seriesId', (req, res, next) => {
... // Check for presence of series
console.log('I am executed');
next();
setTimeout(() => {console.log('Am I executed?')}, 1000); // Prints for 100, does not print for 1000
});
app.get('/:seriesId', (req, res, next) => {
... // Call to db to get series object
res.status(200).json({series: series});
});
调用next()
将处理对管道中下一个中间件的控制。在您的示例中,这将是app.get
但是,该方法的行为不像return
语句,因此您在后面输入的任何代码也将被执行
根据下面的示例,如果要启动服务器并导航到,日志语句将是:
const express=require('express');
常量app=express();
app.param('param',(请求、恢复、下一步)=>{
next();
setTimeout(()=>console.log('well-here's'),1000);
});
app.get('/:param',(请求,res)=>{
设置超时(()=>{
log('执行get');
res.status(200.send();
}, 2000);
});
app.listen(1337);
console.log('应用程序在启动http://localhost:1337');
中间件中的分支
避免混淆的一个好做法是确保在执行结束时调用next()
。例如,不要这样做:
if(条件){
下一个()
}
下一步(新错误(“条件为假”);
但要做到:
if(条件){
下一个()
}否则{
下一步(新错误(“条件为假”);
}
或者,我总是返回next()
调用,以避免中间件执行任何进一步的代码
在中间件中执行异步代码
最后一句话:如果您需要在中间件中执行异步代码,那么只需在该代码执行完毕后调用next()
不要做:
loadUserFromDB()
.然后(u=>req.user=u);
next();
但要做到:
loadUserFromDB()
.然后(u=>{
req.user=u;
next();
});
一切都很清楚-thx。最后一个问题,在我的例子中-如果我在app.param
中使用延迟1000的setTimeout()
,而在app.get
中不使用它,为什么setTimeout(…,1000)
中的语句不会打印到控制台?“如果我输入100,一切正常。”smokedsalmon用给定的代码很难分辨。一种可能的解释是执行实例在一秒钟后关闭。因此,将超时设置为100属于该限制。当您在AWS Lambda或类似的基于云的解决方案上运行代码时,可能会发生这种情况。我最好的猜测是,当我将延迟设置为1000时,另一个测试请求(post/put)会在执行setTimeout()
中的回调之前运行,从而关闭上一次执行。@smokedsalmon这是一个合理的解释是的,下一次测试运行时会终止上一次执行。