【问题标题】:Node js POST Request error Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client节点js POST请求错误错误[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头
【发布时间】:2019-12-26 01:15:28
【问题描述】:

我使用 Node JS、Express 和 Mongo DB 开发了 REST 服务。 我已经定义了一个将用户添加到数据库表中的 POST 请求,当我尝试(在本地主机上)POSTMAN 的 REST 服务时,他工作并将用户添加到表中,但是节点应用程序崩溃(server.js)并且我收到了这个错误: 抛出新的 ERR_HTTP_HEADERS_SENT('set'); ^

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头 错误是指我的这个我的代码:

router.post('/user', VerifyToken, function (req, res) {
User.findOne({ username: req.body.username }, function (err, user) {
    if (user) return res.status(400).send({status: 'ko', error: { msg: 'The username you have entered is already associated with another user.'}});

    var hashedPassword = bcrypt.hashSync(req.body.password, 8);
    User.create({
        firstname:req.body.firstname,
        surname:req.body.surname,
        username:req.body.username,
        email: req.body.email,
        password: hashedPassword,
        farmId: req.body.farmId,
        roles: req.body.roles,
        isVerified : req.body.isVerified,
        statusUser : req.body.statusUser
        },
        function (err, user) {
            if (err) return res.status(500).send("There was a problem adding the user to the database.");
            res.status(200).send({status: 'ok', data: { msg: 'User saved', user: user}});

            var client = nodemailer.createTransport(sgTransport(options));

            var email = {
                from: 'noreply-tlcplus@trelleborg.com',
                to: req.body.email,
                subject: 'Registration successfully confirmed',
                text: 'Hi '+ req.body.username + ',\n\nyour account has been registered.\n\nAre you the farm owner?' +
                '\n\nPlease go to this link [CMS link] to create your Profile and start to use the App Plus!\n\n'+
                'If you are a simple user, please just use your credentials to login to the App Plus section into the new App!\n\n'+
                'Download for free from App Store or Google Play!\n\nRegards,\n\nTrelleborg TLC Plus team'
            };

            client.sendMail(email, function(err, json){
                if (err){
                    return res.status(500).send({ msg: err.message });
                }
                else {
                    res.status(200).send({status: 'ok', data: { msg: 'A verification email has been sent to ' + user.email + '.'}} )
                }
            });

        });

});

});

在发送验证邮件的 res.status(200) 上出现线路错误。 为什么我的应用程序崩溃,错误在哪里? 请问有什么帮助吗? 谢谢

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    发生这种情况是因为您发送了两次响应。因此,错误:

    Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    

    将您的代码更改为以下内容:

    router.post('/user', VerifyToken, function (req, res) {
    User.findOne({ username: req.body.username }, function (err, user) {
        if (user) return res.status(400).send({status: 'ko', error: { msg: 'The username you have entered is already associated with another user.'}});
    
        var hashedPassword = bcrypt.hashSync(req.body.password, 8);
        User.create({
            firstname:req.body.firstname,
            surname:req.body.surname,
            username:req.body.username,
            email: req.body.email,
            password: hashedPassword,
            farmId: req.body.farmId,
            roles: req.body.roles,
            isVerified : req.body.isVerified,
            statusUser : req.body.statusUser
            },
            function (err, user) {
                if (err) return res.status(500).send("There was a problem adding the user to the database.");
    
    
                var client = nodemailer.createTransport(sgTransport(options));
    
                var email = {
                    from: 'noreply-tlcplus@trelleborg.com',
                    to: req.body.email,
                    subject: 'Registration successfully confirmed',
                    text: 'Hi '+ req.body.username + ',\n\nyour account has been registered.\n\nAre you the farm owner?' +
                    '\n\nPlease go to this link [CMS link] to create your Profile and start to use the App Plus!\n\n'+
                    'If you are a simple user, please just use your credentials to login to the App Plus section into the new App!\n\n'+
                    'Download for free from App Store or Google Play!\n\nRegards,\n\nTrelleborg TLC Plus team'
                };
    
                client.sendMail(email, function(err, json){
                    if (err){
                        return res.status(500).send({ msg: err.message });
                    }
    
                   res.status(200).send({status: 'ok', data: { msg: 'A verification email has been sent to ' + user.email + '.'}, message: 'User saved.'} )
    
                });
    
            });
    
    });
    
    });
    

    【讨论】:

      【解决方案2】:

      您不能为单个请求发送多个响应。您正在向请求发送两次响应。一个在创建记录后,另一个在发送邮件后。创建用户后发送它并在后台发送电子邮件,或者仅在邮件发送过程完成后发送成功响应。

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-17
        • 2021-07-21
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        • 2022-11-03
        • 2020-05-26
        • 2018-09-19
        相关资源
        最近更新 更多