2016-05-14 12 views
4

Ich benutze mysql und Express, um ein einfaches Login-System zu schreiben.nodejs connect mysql Fehler

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

jedoch jedes Mal, wenn ich diesen Fehler:

/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) 

Wie es zu lösen? Ich weiß nicht, wie ich es lösen und lange suchen soll. Wenn ich es nicht klar schildere, nur Kommentar und ich werde alles, was ich weiß, hinzufügen.

+0

Ich denke, dein Problem ist nicht mit "mysql", aber es ist, dass Sie versuchen, Antwortobjekt zu ändern, nachdem es an den Benutzer gesendet wurde. (siehe Stack-Trace) –

Antwort

1

Ich erklärte Ihr Problem in den Kommentaren in Code.

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

ich zurückkehren sollte in den, wenn:

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

Sie haben Probleme im folgenden Ausschnitt.

Es ist klar von Fehler-Stack-Ablaufverfolgung, dass Sie versuchen, Header festzulegen, nachdem es gesendet wird. Dies bedeutet, dass die Anweisung if zuerst ausgeführt wird und wenn sie wahr ist, wird sie an /home umgeleitet, danach wird die Klausel if beendet und versucht, eine Nachricht an den Benutzer zu senden.

Mögliche Lösung

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

es prüfen, ob es Ihnen hilft.