node.js - 在 node.js / Express 中,为什么在 next() 之后有时需要返回语句,有时不需要?
问题描述
在下面的测试代码req.query
中检查它的值是否为 name=cat。如果这不是真的next()
会触发下一个中间件。这是在不包含return
声明的情况下完成的,next()
并且可以按预期工作。
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');
});
每次更改res.send('it was cat');
第一个中间件后都会触发,无论名称的值如何。此外,第二个中间件永远不会触发。
这可以通过在第一个中间件中添加return
after来轻松解决。next()
行为再次变得可预测。
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
声明都会发生这种情况?return
使用时需要 A,但使用时res.sendFile
不需要res.send
。我确定我遗漏了一些明显的东西,但我不明白这种模式。
解决方案
这是在不包含
return
声明的情况下完成的,next()
并且可以按预期工作。
不,它看起来像预期的那样工作,但事实并非如此。例如,如果您在/test
没有查询参数的情况下检索,或者使用不等于的查询参数进行检索name=cat
,Express 将记录一个错误:
Error: Can't set headers after they are sent.
我无法重现您的第二个示例;对我来说,它总是返回“它是猫”(在没有 的示例中return
)。
任何 Express 处理程序/中间件的通用规则是:它应该结束响应本身(通过调用res.end
、res.send
、res.render
、res.sendFile
等)或使用next
. 在你的情况下,没有return
,你正在做这两个。实际上,其结果将是未定义的。
推荐阅读
- c++ - 函数指针指向的函数,返回指向同类型其他函数的函数指针
- c++ - 在 VSCode 上使用 F5 进行调试失败,提示“无法建立与 GDB 的连接”
- java - 如何在球衣中对动态资源使用 swagger 注释
- reactjs - 我如何解决 React useEffect 清理错误问题
- python - 我的最后一个 ouyput 在尝试 break staement 后继续循环,它继续这里是我在 python3 中的代码
- excel - 带有引用的 Excel VBA BuiltInDocumentProperties
- docker - 在 Windows 服务器上安装 Docker 时出错
- python - 在 aws lambda 中通过命令运行 python 脚本
- php - 在 ajax 函数上添加 die() 后 WP_Query 未显示
- node.js - 查找文档数组中元素的 ObjectId,该元素位于带有 Mongoose 的模型中