【发布时间】: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