【问题标题】:Error not shown on Postman and causes NodeJS server to crash错误未在 Postman 上显示并导致 NodeJS 服务器崩溃
【发布时间】:2023-01-01 21:08:01
【问题描述】:

我正在处理用户身份验证并使用 JWT 创建受保护的路由。我有一个 authMiddleware,如果没有令牌,它应该会抛出一个错误。使用 Postman 进行测试时(不提供令牌),Postman 显示

Could not get response
Error: read ECONNRESET 

和服务器崩溃。这是控制台上显示的错误:

throw new Error("Not authorized");
            ^

Error: Not authorized at protect (file:///C:/Users/Suleyman/Desktop/converter/server/middleware/authMiddleware.js:26:13)

不知何故,我在线路本身 + 实际错误消息上收到错误,但服务器崩溃,需要重新启动。我正在使用 errorMiddleware,我认为这不是问题所在。这是我的相关代码:

授权中间件:


import User from '../models/userModel.js';

export const protect = async (req, res, next) => {
  let token;

  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith("Bearer")
  ) {
    try {
      // Get token from header
      token = req.headers.authorization.split(" ")[1];

      // Verify token
      const decoded = jwt.verify(token, process.env.JWT_SECRET);

      // Get user from the token
      req.user = await User.findById(decoded.id).select("-password");

      next();
    } catch (error) {
      console.log(error);
      res.status(401);
      throw new Error("Not authorized");
    }
  }

  if (!token) {
    res.status(401);
    throw new Error("Not authorized, no token");
  }
}; 

控制器文件:

 // Get Me

export const getMe =  (req,res) => {
   res.json({message:'user data'})
} 

用户路由

import { getMe, loginUser, registerUser } from "../controllers/userController.js";
import { protect } from "../middleware/authMiddleware.js";

const router = express.Router();



router.post("/register", registerUser);
router.post("/login", loginUser);
router.get("/me",protect, getMe);
 
export default router;

【问题讨论】:

  • 捕获错误只是为了在下一行再次抛出它的目的是什么?
  • expressjs.com/en/guide/error-handling.html对于由路由处理程序和中间件调用的异步函数返回的错误,您必须将它们传递给 next() 函数,Express 将在该函数中捕获并处理它们。

标签: javascript node.js error-handling jwt mern


【解决方案1】:

问题出在你的问题上:

catch (error) {
  console.log(error);
  res.status(401);
  throw new Error("Not authorized"); // you should remove this line
}

你的 catch 得到了错误,但随后你抛出了一个不会被任何人捕获的新错误:这就是你的服务器崩溃的地方。

更好的方法是将错误传递给next,并在您的错误中间件中处理它(使用您的res.sendStatus(401)):

catch (error) {
  console.error(error);
  next(error);
}

console.error也可能在错误中间件中移动)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多