我正在阅读包含两个文件的代码,如下所示:
第一个使用currentuser
中间件的文件:
const router = express.Router();
router.get("/api/users/currentuser", currentUser, (req, res) => {
res.send({ currentUser: req.currentUser || null });
});
export { router as currentUserRouter };
定义中间件的第二个文件:
interface UserPayload {
id: string;
email: string;
}
declare global {
namespace Express {
interface Request {
currentUser?: UserPayload;
}
}
}
export const currentUser = (
req: Request,
res: Response,
next: NextFunction
) => {
if (!req.session?.jwt) {
return next();
}
try {
const payload = jwt.verify(
req.session.jwt,
process.env.JWT_KEY!
) as UserPayload;
req.currentUser = payload;
} catch (err) {}
next();
};
据我所知,如果有经过验证的 jwt
token ,中间件将从其中取出有效负载并将其添加到 req
对象中。但是,如果失败并且无法将有效负载/当前用户添加到 req
中怎么办?以下请求会发生什么以及 res
对象会是什么样子?
router.get("/api/users/currentuser", currentUser, (req, res) => {
res.send({ currentUser: req.currentUser || null });
});
您能否编辑此 get
请求以显示如果我不是中间件的编写者,我如何捕获可能的错误?
最佳答案
如果您有一个包罗万象的异常处理程序,并且您的中间件引发了异常,您将确定响应。
如果您的中间件抛出异常并且您没有捕获它,系统可能会退出该进程。
如果你的中间件没有抛出异常,没有调用 next(),也没有响应,请求就会挂起。
如果您的中间件返回响应,并且没有调用 next(),则您的发送函数将永远不会被调用。
最重要的是,您需要将响应转储到服务器上,并准确查看中间件如何处理此问题。
在我的大多数身份验证中间件中,我选择不调用 next(),并返回 403 错误。但是抛出异常,然后从包罗万象的处理程序返回 403 有一些好处。
关于node.js - 如果中间件在 REST API 中失败,会有什么响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74296861/