在 Express.js 中,我是否应该返回响应?

Nic*_*cky 15 javascript node.js express typescript

对于 Express.js 4.x,我无法确定是否应该返回响应(或下一个函数),因此:

这个:

app.get('/url', (req, res) => {
    res.send(200, { message: 'ok' });
});
Run Code Online (Sandbox Code Playgroud)

或这个:

app.get('/url', (req, res) => {
    return res.send(200, { message: 'ok' });
});
Run Code Online (Sandbox Code Playgroud)

有什么区别?

Ahm*_*rib 18

我不同意上面的答案。有时回调函数可以返回多个响应,具体取决于应用程序的逻辑:

router.post("/url", function(req, res) {
// (logic1)
     res.send(200, { response: 'response 1' });
   // (logic2) 
      res.send(200, { message: 'response 2' });
    }})  
Run Code Online (Sandbox Code Playgroud)

这将引发此错误:

错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头

这实际上可以通过使用return来解决。也可以通过使用 if else 子句来解决。

  • 你是完全正确的,这在逻辑上会产生影响。然而,这个问题只是意味着它在语义上是否有所不同。当然,如果您不返回第一个响应,则所有后续响应都会抛出您的错误。感谢您添加此内容! (4认同)

Mik*_*ans 14

你没有。该(req, res)签名告诉表示,这是在链中的最后一个函数,它不指望从这个函数返回值。您可以添加 return 语句,但除了 JS 引擎执行一些额外的(但无意义的)开销之外,它不会“做任何事情”。


Tho*_*tre 10

这取决于。

调用resorreq回调并不意味着您的路由功能将停止工作

app.get('/url', (req, res) => {

    if (true) {
        res.send(200, { message: 'ok' });
    }

    const newFunction = () => {
        // stuff useless to your routing function
    }
    newFunction()

});
Run Code Online (Sandbox Code Playgroud)

在这里,它将newFunction()被调用,但它没有用,它会影响你的服务器性能。

你最好return res.send(200, { message: 'ok' });每次都使用,除非你想在后台创建一个进程......

该过程通常不会超过经典的 30 秒 http 请求。(例如,我正在制作一个每天需要 4 或 5 小时的作品:D)