我知道这个问题已经被问了好几次了,但提供的解决方案对我不起作用。
我有一个受保护的路由来查找用户。请求由authenticate
中间件验证,该中间件主要检查用户的cookie是否有效,然后调用路由getUser
。当我不使用中间件时,该路由运行良好,因此问题可能来自authenticate
。
我已经按照建议使用了return res.status(200).json({})
。
在用cookie测试路由时,chai打了两个电话。第一个成功,但一旦路由被命中,就进行另一个呼叫,没有任何cookie。奇怪的在《邮差》里也是一样。它在没有authenticate
的情况下工作得很好,但带着它返回unauthorized
。在终端中,错误为:
[ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
这是authenticate
中间件和路由:
// router
const router = express.Router();
router.get("/user/:id", authenticate, getUser);
// authenticate
const authenticate = (req: Authenticate, res: Response, next: NextFunction) => {
const { mycookie } = req.cookies;
if (mycookie) {
jwt.verify(mycookie, process.env.JWT_TOKEN_KEY, (error, parsedToken) => {
if (error) {
return res.sendStatus(403);
}
req.cookie = { _id: parsedToken._id, locale: parsedToken.locale };
return next();
});
}
return res.sendStatus(401);
};
export default authenticate;
// the get - user/:id route
const getUser = async (
req: GetUser,
res: IResponse
): Promise<IResponse> => {
try {
const user = await UserControler.findUserById(req.params.id);
return res.status(200).json({ user });
} catch (err) {
throw new Error("error.unknown");
}
};
export default getUser;
如何解决此问题?
在authenticate
函数中,您忘记向if (mycookie)
添加else
语句。
因此,未经授权的cookie总是会被发送,这显然是您使用好的cookie未经授权,然后与已经发送的未经授权一样,当getUser尝试发送http响应时,您描述的错误将抛出。
将return res.sendStatus(401);
封装在else
语句中,它应该可以正常工作。