【问题标题】:nodejs connect mysql errornodejs连接mysql错误
【发布时间】:2016-09-10 10:29:10
【问题描述】:

我用mysql和express写了一个简单的登录系统。

数据库.js:

var mysql = require('mysql');
var config = require('../config/config');

var pool = mysql.createPool(config.mysql_dev);

var query=function(sql,callback){  
    pool.getConnection(function(err,conn){  
        if(err) console.log("POOL ==> " + err);
        else{  
            conn.query(sql,function(qerr,vals,fields){  
                //release connection  
                conn.release();
                callback(qerr,vals,fields);  

            });  
        }  
    });  
};  

module.exports=query;

index.js:

router.post('/login',function(req,res){ 
    var query = require('../modules/database');
    query("select * from managers where ManagerID =10001",function(err,vals,fields){  
        var temp=JSON.stringify(vals);

        var manager = JSON.parse(temp)[0];

        if(req.body.password===manager.password){
           req.session.manager = manager;
           res.redirect('/home');
        }
        res.send('ID or password wrong!');
    });
});

但是,每次我收到此错误时:

/opt/workspace/project/nodejs-demo/node_modules/mysql/lib/protocol/Parser.js:77
        throw err; // Rethrow non-MySQL errors
        ^

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
    at ServerResponse.header (/opt/workspace/project/nodejs-demo/node_modules/express/lib/response.js:718:10)
    at ServerResponse.send (/opt/workspace/project/nodejs-demo/node_modules/express/lib/response.js:163:12)
    at /opt/workspace/project/nodejs-demo/routes/index.js:40:7
    at Query._callback (/opt/workspace/project/nodejs-demo/modules/database.js:16:17)
    at Query.Sequence.end (/opt/workspace/project/nodejs-demo/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)
    at Query._handleFinalResultPacket (/opt/workspace/project/nodejs-demo/node_modules/mysql/lib/protocol/sequences/Query.js:144:8)
    at Query.EofPacket (/opt/workspace/project/nodejs-demo/node_modules/mysql/lib/protocol/sequences/Query.js:128:8)
    at Protocol._parsePacket (/opt/workspace/project/nodejs-demo/node_modules/mysql/lib/protocol/Protocol.js:280:23)
    at Parser.write (/opt/workspace/project/nodejs-demo/node_modules/mysql/lib/protocol/Parser.js:73:12)

如何解决? 不知道怎么解决,找了半天。 如果我描述不清楚,请发表评论,我会添加我知道的任何内容。

【问题讨论】:

  • 我认为您的问题不在于mysql,而是您在将响应对象发送给用户后尝试更改它。 (参见堆栈跟踪)

标签: mysql node.js express


【解决方案1】:

我在代码中用 cmets 解释了你的问题。

router.post('/login',function(req,res){ 
    var query = require('../modules/database');
    query("select * from managers where ManagerID =10001",function(err,vals,fields){  
        var temp=JSON.stringify(vals);

        var manager = JSON.parse(temp)[0];

        if(req.body.password===manager.password){
           req.session.manager = manager;


           //You are redirecting user to home
           res.redirect('/home');

           //You should add 'return'
           return;
        }

        //This will only accessible if password is not match
        res.send('ID or password wrong!');
    });
});

【讨论】:

    【解决方案2】:

    您在以下 sn-p 中遇到问题。

    if(req.body.password===manager.password){
       req.session.manager = manager;
       res.redirect('/home');
    }
    res.send('ID or password wrong!');
    

    从错误堆栈跟踪中可以清楚地看出,您正在尝试在发送标头后设置标头。这意味着if语句首先执行,如果为真,则重定向到/home,然后退出if子句并尝试向用户发送消息。

    可能的解决方案

    if(req.body.password===manager.password){
       req.session.manager = manager;
       res.redirect('/home');
    } else {
       res.send('ID or password wrong!');
    }
    

    检查一下,如果对你有帮助。

    【讨论】:

      【解决方案3】:

      我应该在 if 中返回:

      if(req.body.password===manager.password)       
       {
          req.session.manager = manager;
          res.redirect('/home');
          return;
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 2016-10-30
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        相关资源
        最近更新 更多