【问题标题】:Solve return value issue for NodeJS (Express) and Eslint?解决 NodeJS (Express) 和 Eslint 的返回值问题?
【发布时间】:2022-01-16 01:29:18
【问题描述】:
module.exports = function protectedRoute(request, response, next) {
  const token = request.headers.authorization;
  if (!token) {
    return response.status(401).json({ message: 'invalid or token missing' });
  }

  const accessToken = token.split(' ')[1];

  jwt.verify(accessToken, 'access', (error, user) => {
    if (error) {
      response.status(401).json({ message: 'User not authenticated' });
    } else {
      request.user = user;
      next();
    }
  });
};

Eslint 给出错误:“预期在函数结束时返回值”。现在我解决了这个问题:

return null; // at the end of the function

但我想返回一些有意义的东西,例如:

return response.status(503).json({ message: 'service unavailable' });

但此返回在 API 调用时出错:“无法设置标头在发送到客户端后”

关于如何处理这个问题有什么建议吗?

【问题讨论】:

    标签: node.js api express eslint


    【解决方案1】:

    从未检查过像这样的middleware function 的返回值,因此它不需要返回任何内容。为了满足 eslint,return null; 就可以了。

    您的“有意义”返回语句的问题在于它同步向客户端发送响应,而与jwt.verify 语句的结果无关。这个结果在(error, user) => ... 回调函数中异步处理。那么发生的情况是:首先发送 503 响应和“服务不可用”消息,然后

    • 发送带有“用户未通过身份验证”的 401 响应(如果回调有 error
    • 或调用下一个中间件并尝试发送响应。

    在这两种情况下,第二个响应的标头都是在第一个响应已经发送之后设置的,因此会出现错误。当然,发送两个响应没有意义。

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2021-03-17
      • 2021-10-11
      • 2021-04-17
      • 2016-02-10
      • 2014-07-20
      相关资源
      最近更新 更多