为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?
Posted
技术标签:
【中文标题】为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?【英文标题】:why do i keep getting 'Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client' error?为什么我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误? 【发布时间】:2022-01-15 21:56:46 【问题描述】:好的,我对 node js 还很陌生,我正在学习用户身份验证。我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误。有人能告诉我我的代码有什么问题以及如何解决吗?当我在邮递员中测试它时,注册路线有效,它的登录路线给了我这个问题。这是我的代码:
const User = require('../models/User')
const CryptoJS = require("crypto-js");
const jwt = require("jsonwebtoken");
const BadRequestError, UnauthenticatedError = require('../errors')
const Register = async (req, res)=>
const newUser = new User(
username: req.body.username,
email: req.body.email,
password: CryptoJS.AES.encrypt(req.body.password, process.env.pass_secret ).toString(),
);
if(newUser)
const savedUser = await newUser.save();
res.status(201).json(savedUser);
const Login = async (req, res) =>
const username = req.body
//checking if both the email and password are provided
if(!username)
throw new BadRequestError('please provide a username and password')
//finding a user with the email, if the user doesnt exist, return an error
const user = await User.findOne(username: req.body.username);
if(!user)
throw new UnauthenticatedError('Invalid username or password')
//checking if the passwords match
const hashedPassword = CryptoJS.AES.decrypt( user.password, process.env.pass_secret);
const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
if(originalPassword !== req.body.password)
throw new UnauthenticatedError('Invalid email or password')
const accessToken = jwt.sign( id: user._id, isAdmin: user.isAdmin, process.env.jwt_secret, expiresIn:"30d");
const password, ...others = user._doc;
res.status(200).json(...others, accessToken);
module.exports = Register, Login
【问题讨论】:
【参考方案1】:无论你有这个:
if(newUser)
const savedUser = await newUser.save();
res.status(201).json(savedUser);
您需要将其更改为:
if(newUser)
const savedUser = await newUser.save();
res.status(201).json(savedUser);
return;
您不希望代码在完成后继续运行
res.status(201).json(savedUser);
因为它会尝试发送另一个响应。
此外,你到处都有这个:
if (err) throw err;
在异步回调中,您需要将其替换为实际发送错误响应的内容,例如:
if (err)
console.log(err);
res.sendStatus(500);
return;
【讨论】:
对不起,我忘了提到注册路线工作正常。当我使用注册路由创建用户后尝试登录时,我得到了该错误。我不知道这是否会影响你的回答。 我认为在Login函数末尾添加return语句可以解决错误以上是关于为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不断收到“java.net.MalformedURLException:无协议”[重复]
为啥我不断收到这个受诅咒的 SQL*Plus 无效标识符错误?