解决 NodeJS (Express) 和 Eslint 的 return 值问题?

Solve return value issue for NodeJS (Express) and Eslint?

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 值”。现在我解决了这个问题:

return null; // at the end of the function

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

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

但是这个 return 在 API 调用时出错:“将它们发送到客户端后无法设置 headers”

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

像这样的middleware function的return值从来没有检查过,所以不需要return任何东西。满足eslint,return null;即可。

您的“有意义的”return 语句的问题在于它 同步地 向客户端发送独立于 jwt.verify 语句的结果的响应.此结果在 (error, user) => ... 回调函数中 异步处理 。所以发生的事情是:首先发送 503 响应和“服务不可用”消息,然后

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

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