gpt4 book ai didi

node.js - 在node.js/Express中,为什么有时在next()之后需要return语句,有时不需要?

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:12 27 4
gpt4 key购买 nike

在下面的测试代码中,检查req.query以查看其值是否为name=cat。如果这不是 true,next() 将触发下一个中间件。这是在 next() 之后不包含 return 语句的情况下完成的,并且它按预期工作。

app.get('/test', (req, res, next) => {
if (req.query.name != 'cat') {
next();
}
res.send('it was cat');
});

app.get('/test', (req, res) => {
res.send('it was not cat');
});

但是,当我在第二个中间件中将 res.send 更改为 res.sendFile 时,行为完全不同。

app.get('/test', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
});

更改后,无论 name 的值如何,第一个中间件中的 res.send('it was cat'); 每次都会触发。此外,第二个中间件永远不会触发。

通过在第一个中间件中的 next() 之后添加 return 可以轻松解决此问题。行为再次变得可预测。

app.get('/test', (req, res, next) => {
if (req.query.name != 'cat') {
next();
return;
}
res.send('it was cat');
});

app.get('/test', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
});

为什么在有或没有return语句的情况下都会发生这种情况?当我使用 res.sendFile 时需要 return,但当我使用 res.send 时则不需要。我确信我遗漏了一些明显的东西,但我不明白其中的模式。

最佳答案

This is accomplished without including a return statement after next() and it works as expected.

不,它看起来像预期的那样工作,但事实并非如此。例如,如果您在没有查询参数的情况下检索 /test,或者使用不等于 name=cat 的查询参数,Express 将记录错误:

Error: Can't set headers after they are sent.

我无法重现你的第二个例子;对我来说,它总是返回“it was cat”(在没有 return 的示例中)。

任何 Express 处理程序/中间件的通用规则是:它应该或者结束响应本身(通过调用 res.endres.sendres.renderres.sendFile 等)使用 next 传递请求。就您而言,如果没有 return,您就同时执行了这两件事。实际上,其结果将是未定义的。

关于node.js - 在node.js/Express中,为什么有时在next()之后需要return语句,有时不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52372711/

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