Node.js 发送到客户端后无法设置标头

Posted

技术标签:

【中文标题】Node.js 发送到客户端后无法设置标头【英文标题】:Node.js Cannot set headers after they are sent to the client 【发布时间】:2020-09-05 09:15:18 【问题描述】:

我正在 Udemy 上学习关于 node.js 的课程,该课程有点过时,并且遇到了这些我无法找到解决方案的错误。

我尝试了什么:

使用 next(); 在所有 if 语句中添加 return res

有人可以帮我解决这些问题吗?我将不胜感激!

提前致谢!

用户名存在错误:错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:526:11) 在 ServerResponse.header (C:\Users\Documents\projects\chat-app\chat-app-backend\node_modules\express\lib\response.js:771:10) 在 ServerResponse.send (C:\Users\Documents\项目\chat-app\chat-app-backend\node_modules\express\lib\response.js:170:12) 在 ServerResponse.json (C:\Users\Documents\projects\chat-app\chat-app-backend\node_modules\express\lib\response.js:267:15) 在 C:\Users\Documents\projects\chat-app\chat-app-backend\controllers\auth.js:38:56 在 processTicksAndRejections (internal/process/task_queues.js:97:5) 代码:'ERR_HTTP_HEADERS_SENT'

module.exports = 
    CreateUser(req, res) 

        const schema = Joi.object().keys(
            username: Joi.string().min(5).max(15).required(),
            email: Joi.string().email().required(),
            password: Joi.string().min(5).required()
        );

        const error, value = Joi.validate(req.body, schema);

        if (error && error.details) 
            return res.status(HttpStatus.BAD_REQUEST).json(message: error.details);
         

        async function EmailExists() 
            return await User.findOne(email: Helpers.lowerCase(req.body.email)) != undefined;
        

        async function UsernameExists() 
            return await User.findOne(username: Helpers.firstLetterUppercase(req.body.username));
        

        EmailExists().then(exists => 
            if (exists) 
                return res.status(HttpStatus.CONFLICT).json(message: 'Email already exists');
            
        ).catch((err) => console.log('Email exists error: ', err));

        UsernameExists().then(exists => 
            if (exists) 
                return res.status(HttpStatus.CONFLICT).json(message: 'Username already exists') != undefined;
            
        ).catch((err) => console.log('Username exists error: ', err));


        return BCrypt.hash(value.password, 10, (error, hash) => 
            if (error) 
                return res.status(HttpStatus.BAD_REQUEST).json(message: 'Error hashing password');
            

            const body = 
                username: Helpers.firstLetterUppercase(value.username),
                email: Helpers.lowerCase(value.email),
                password: hash
            ;

            User.create(body).then((user) => 
                res.status(HttpStatus.CREATED).json(message: 'User created successfully');
            ).catch((err) => 
                res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(message: 'Something went wrong. Could not save user');
            );
        );
    

【问题讨论】:

您尝试发送两次响应,这就是您遇到此错误的原因 【参考方案1】:

你正在执行一些承诺,在执行下一个代码之前不要等待答案......

有很多方法可以处理这个问题,下面的代码只是一种方法......

    const hash = () => BCrypt.hash(value.password, 10, (error, hash) => 
        if (error) 
            return res.status(HttpStatus.BAD_REQUEST).json(message: 'Error hashing password');
        

        const body = 
            username: Helpers.firstLetterUppercase(value.username),
            email: Helpers.lowerCase(value.email),
            password: hash
        ;

        User.create(body).then((user) => 
            res.status(HttpStatus.CREATED).json(message: 'User created successfully');
        ).catch((err) => 
            res.status(HttpStatus.INTERNAL_SERVER_ERROR).json(message: 'Something went wrong. Could not save user');
        );
    );


    EmailExists().then(exists => 
        if (exists) 
            return res.status(HttpStatus.CONFLICT).json(message: 'Email already exists');
        

           UsernameExists().then(exists => 
                if (exists) 
                   return res.status(HttpStatus.CONFLICT).json(message: 'Username already exists') != undefined;
                

                return hash();
           ).catch((err) => console.log('Username exists error: ', err));          


    ).catch((err) => console.log('Email exists error: ', err));

【讨论】:

以上是关于Node.js 发送到客户端后无法设置标头的主要内容,如果未能解决你的问题,请参考以下文章

发送标头后设置标头时出错 - Node.js

Node.js,Express:将标头发送到客户端后无法设置标头

发送到客户端后无法设置标头

为啥显示此错误?发送到客户端后无法设置标头

NodeJS "发送到客户端 NodeJS 后无法设置标头"

http POST响应后,发送到客户端后无法设置标头