在 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】:
视情况而定。
调用res
或req
回调并不意味着您的路由功能将停止工作
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 总是在浏览器响应中返回一个无效的令牌错误