gpt4 book ai didi

node.js - 为什么这个node.js回调没有立即运行?

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:07 25 4
gpt4 key购买 nike

使用 express-generator 它会输出一些错误处理代码,如下所示:

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}

在此示例中,如果(无论出于何种原因)我的路由被破坏或未找到路由或其他任何情况,代码将回退并在第二个代码块中抛出 404。为什么第三个代码块(500 处理程序)在第二个代码块(404 处理程序)开始执行后没有立即执行?

我认为node.js回调的工作方式是函数开始执行并继续在后台执行,然后下一个回调同时开始执行。但显然我对同步回调的工作原理有点困惑。上面的代码是否知道在运行 500 错误处理程序之前“等待”404 处理程序代码执行完毕?

最佳答案

所有 app.use() 语句在您的应用初始化时运行。他们各自设置了一个“中间件”处理程序。他们当时并不实际运行处理程序,只是将它们注册到 Express 中间件堆栈中。如果它们之前没有处理程序处理页面,那么最后两个 app.use() 中间件处理程序将按顺序获取请求,而第二个处理程序只有在第一个将请求传递给更多处理程序时才能看到该请求。

404 处理程序会将状态设置为 404,然后调用中间件堆栈中的 next() 处理程序。这最终将成为您的最后一个 app.use() 语句,该语句将查看状态是否已设置,如果没有,则将其设置为 500,但如果之前设置为 404,则会保留该状态。然后,它将对缺失的页面应用默认呈现,以显示页面中的状态。

这是一种在单个位置应用默认渲染的方法,但在多个位置可能会设置错误。

这些实际上与异步行为没有任何关系。仅当较早的请求处理程序调用 next() 时,才会启动列表中的下一个请求处理程序。没有“等待”。您可以将使用最后一个 app.use() 语句的 404 请求处理程序视为同步函数调用,当它调用 next() 时,它只是说请立即执行链中的下一个请求处理程序(它碰巧知道这是为错误状态代码提供默认呈现的处理程序)。

<小时/>

回顾一下 app.use() 在 Express 中的工作原理可能会有所帮助。

每次调用 app.use() 都会向列表中添加一个请求处理程序。当给定的 http 请求到来时,Express 从列表中的第一个请求处理程序开始,并检查列表中第一个请求处理程序的参数是否与当前请求匹配(例如,路径是否匹配或 app.use() 语句中设置的任何其他参数)。如果匹配,则调用该请求处理程序。如果该请求处理程序没有调用 next() 来让列表中的下一个请求处理程序有机会处理该请求,则所有处理都会完成,并且 Express 会假定第一个请求处理程序已完全处理该请求。如果第一个请求处理程序尚未完全处理该请求(假设它只是检查 header 中的 cookie 值并希望处理继续到其他处理程序),那么它将调用 next()。这告诉express查看列表中的下一个app.use()处理程序,看看它是否与该请求匹配。

只要没有请求处理程序与当前请求匹配,或者每个请求处理程序都不断调用 next() 来保持链继续运行,Express 将继续沿着列表向下查找某个请求处理程序来处理该请求并生成服务器响应。在您的具体示例中,链中倒数第二个请求是 404 处理程序。它假设如果 Express 在链中到达了这么远,那么还没有处理程序处理此请求,因此它一定是对该服务器未设计处理的页面的请求。因此,它将状态设置为 404。然后,由于错误页面的默认呈现位于最后一个请求处理程序中,因此它调用 next() 来触发包含错误的最后一个默认页面呈现。

<小时/>

关于node.js - 为什么这个node.js回调没有立即运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28679983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com