【问题标题】:Node js return can not set after headers they are sent发送标头后无法设置节点js返回
【发布时间】:2015-05-13 04:11:06
【问题描述】:

我在使用 node.js 时遇到问题,他返回 - 控制台上显示错误:

Error: Can not set after headers They are sent.

这里是我返回错误的代码部分:

app.post ('/ register', function (req, res) {
    var = usuarioCadastro req.body.usuario;
    var = emailCadastro req.body.email;
    var = telefoneCadastro req.body.telefone;
    var = senhaCadastro req.body.senha;

    console.log ("User:" + usuarioCadastro);
    console.log ("Email:" + emailCadastro);
    console.log ("Telephone" + telefoneCadastro);
    console.log ("Password" + senhaCadastro);

      pool.query('SELECT * FROM users WHERE email = ?',[emailCadastro], function(err, rows, fields) {
            if (err) throw err;
            for (var i in rows){ var emailBanco = rows[i].email; }
            if(emailCadastro === emailBanco){
                console.log("Email já foi cadastrado");
                res.set('Content-Type', 'application/json');
                res.send({ code: '303', mensagem:'This email already signup' });

            }else{
                var sql = {usuario:usuarioCadastro,email:emailCadastro,senha:senhaCadastro};
                pool.query('INSERT INTO users SET ?',[sql], function(err, rows, fields) {
                    if (err) throw err;
                    console.log("Novo usuario cadastrado");
                    res.send({ code: '200', mensagem:'Sucess, welcome to trimtrim' });

                });/*Second Query*/

            }/* Else */  

});/* 第一个查询*/

我一直在研究,据我所见,表情只能发送一次。我需要发送更多次。我该怎么办?

【问题讨论】:

  • 不,你没有。您实际上只能发送一次,这就是 HTTP 的工作原理。因此,相反,您可以聚合所有需要发送的标头,然后一直到最后,使用您需要的标头调用res.headers,然后是正常的数据响应。

标签: node.js http express


【解决方案1】:

您只能发送一次标头。汇总您的消息并在您的循环之后将它们全部发送。

        connection.release ();
        var msg = '';
        for (var i in rows) {
            if (emailCadastro === rows [i] .email) {
            console.log ("Email database:" + rows [i] .email);

            if (msg.length>0) msg += '<br/>';
            msg += 'E-mail already registered: ' + rows[i].email;

            errodeForm ++;

            }

        } // For

        if (msg.length>0) res.json ({code: 303 Message: msg});

【讨论】:

  • 如果你可以看一下我的代码,我需要返回两个连续的标题,因为这是一个注册检查
  • 我看到您发送超过 1 个标头的唯一地方是在您的 for 循环期间。如前所述,您只能发送一次标头,并且由于您只发送状态标头code: 303,因此不确定您还需要发送哪些其他标头。无需多次发送相同的状态。如果您要发送其他标头,请指出,或发布该代码。
猜你喜欢
  • 2015-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
相关资源
最近更新 更多