为啥我不断收到“错误 [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]:将标头发送到客户端后无法设置标头”错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到交互失败 (discord.py)

为啥我不断收到“java.net.MalformedURLException:无协议”[重复]

为啥我不断收到这个受诅咒的 SQL*Plus 无效标识符错误?

为啥我不断收到“SVN:工作副本 XXXX 锁定;尝试执行“清理”?

为啥我在地图箭头功能中不断收到未定义的错误?

Wavefront OBJ Parsing - 为啥我不断收到不正确的数据作为输出?