如何修复节点中的"cannot set headers after they are sent to the client"错误?



我知道这个问题已经被问了好几次了,但提供的解决方案对我不起作用。

我有一个受保护的路由来查找用户。请求由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语句中,它应该可以正常工作。

相关内容

最新更新