2016-05-14 102 views
4

我用mysql和express寫一個簡單的登錄系統。nodejs連接mysql錯誤

database.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) 

如何解決呢? 我不知道如何解決它並搜索很長時間。 如果我描述不清楚,只是評論,我會添加我知道的任何東西。

+0

我認爲你的問題不是用'mysql',而是你試圖在發送給用戶後改變響應對象。 (請參閱堆棧跟蹤) –

回答

1

我在代碼中的註釋中解釋了您的問題。

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!'); 
    }); 
}); 
0

我應該在返回是否:

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

你有問題,下面的代碼片段。

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

從錯誤堆棧跟蹤中可以清楚地看到,您正在嘗試在發送它之後設置標頭。這意味着if語句首先執行,如果它爲true,則重定向到/home,之後它將退出if子句並嘗試向用戶發送消息。

可能的解決方案

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

檢查它,如果它可以幫助你。