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

Posted

技术标签:

【中文标题】在 Express.js 中,我是不是应该返回响应?【英文标题】: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' );
);

又有什么区别呢?

【问题讨论】:

没什么,它们本质上是一样的。 【参考方案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 可能,没有更多。

以上是关于在 Express.js 中,我是不是应该返回响应?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - Express.js JWT 总是在浏览器响应中返回一个无效的令牌错误

Express.JS:如何按名称而不是数字设置响应状态?

在单个响应中返回 mongoose 错误列表

来自express js的Ajax发布响应不断抛出错误

我啥时候应该在独立的 node.js 上使用 express.js

PATCH 方法是不是应该在响应正文中返回资源的所有字段?