【问题标题】:In Express.js, should I return response or not?在 Express.js 中,我是否应该返回响应?
【发布时间】:2016-03-19 08:09:56
【问题描述】:

对于 Express.js 4.x,我找不到是否应该返回响应(或下一个函数),所以:

这个:

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

或者这个:

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

又有什么区别呢?

【问题讨论】:

  • 没什么,它们本质上是一样的。

标签: javascript node.js express typescript


【解决方案1】:

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

【讨论】:

  • 我们不想要开销!选择现在似乎很明显,谢谢 =)
  • 现在是 2015 年。与函数执行的毫秒数相比,我们不关心符号保留和解析的纳秒开销 =) 但就明智的代码而言,无需显式标记 @987654322 @如果它不会被任何东西消耗。
  • 我想我在这里追求的不是纳秒,我同意你的观点。实际上,我正在寻找的只是最佳实践,因此选择性能开销(甚至以纳秒为单位)是一个简单的选择。
  • 不,在这种情况下,这是一个“每个人都做什么?”的问题,完全与性能无关。作为一般的 JavaScript 实践,任何返回不会被捕获的函数都没有显式返回(无论是否在 express 中),因此在这种情况下,最佳实践来自 JavaScript 本身,而不是专门表达。
【解决方案2】:

我不同意上面的答案。 有时回调函数可以根据应用的逻辑返回多个响应:

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

这会抛出这个错误:

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

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

【讨论】:

  • 您在逻辑上有所作为的方式是绝对正确的。然而,这个问题仅仅意味着它是否在语义上有所不同。当然,如果您不返回第一个响应,那么所有后续响应都会抛出您的错误。感谢您添加此内容!
  • @Nicky 让我写这篇文章的原因是我开始在我的代码中使用 eslint,它有一个规则“一致返回”。一致返回的 ESLint 文档说明了这一点,要求 return 语句始终或从不指定值。在我的大多数控制器功能中,我不是返回值而是发送响应,我是否应该简单地禁用此 ESLint 功能?
【解决方案3】:

视情况而定。

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

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

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

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

});

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

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

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

【讨论】:

  • 我可以在一个回调中调用多个 res 语句吗?我想删除和 res.status(200),然后我想创建其他东西并在一条路线中发送 201
  • 只有一个 res.send 可能,没有更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 2018-05-23
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多