首页 > 解决方案 > 在 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.sendres.sendFile第二个中间件时,行为完全不同。

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

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

这可以通过在第一个中间件中添加returnafter来轻松解决。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。我确定我遗漏了一些明显的东西,但我不明白这种模式。

标签: node.jsexpress

解决方案


这是在不包含return声明的情况下完成的,next()并且可以按预期工作。

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

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

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

任何 Express 处理程序/中间件的通用规则是:它应该结束响应本身(通过调用res.endres.sendres.renderres.sendFile等)使用next. 在你的情况下,没有return,你正在做这两个。实际上,其结果将是未定义的。


推荐阅读