在nodejs和mysql中发送后无法设置标题

时间:2019-05-25 13:12:13

标签: mysql node.js express

我正在提交登录表单并检查用户名或密码是否正确,但是在这里我遇到了错误提示,请帮助我解决该错误。谢谢

app.post('/login', function(request, response) {

  var username = request.body.username;
  var password = request.body.password;
  if (username && password) {
    connection.query('SELECT * FROM users WHERE username = ? AND password = ?', [username, password], function(error, results, fields) {
      console.log(results);
      if (results.length > 0) {
        request.session.loggedin = true;
        request.session.username = username;
        // request.session.w_id = us;
        response.redirect('/');
        next();
      } else {
        response.render('login', {layout: 'login',error:'Invalid Username Or Password'});
      }         
      response.end();
    });
  } else {
    response.render('login', {layout: 'login',error:'Please Enter Username And Password'});
    response.end();
  }
});

错误

throw new Error('Can\'t set headers after they are sent.');
    ^

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (D:\Node Projects\uni_project\node_modules\express\lib\response.js:775:10)
    at ServerResponse.contentType (D:\Node Projects\uni_project\node_modules\express\lib\response.js:603:15)
    at ServerResponse.send (D:\Node Projects\uni_project\node_modules\express\lib\response.js:149:14)
    at done (D:\Node Projects\uni_project\node_modules\express\lib\response.js:1012:10)
    at Immediate._onImmediate (D:\Node Projects\uni_project\node_modules\express-handlebars\lib\utils.js:26:13)
    at runCallback (timers.js:810:20)
    at tryOnImmediate (timers.js:768:5)
    at processImmediate [as _immediateCallback] (timers.js:745:5)

1 个答案:

答案 0 :(得分:0)

问题出在这个区块

  if (results.length > 0) {
    request.session.loggedin = true;
    request.session.username = username;
    // request.session.w_id = us;
    response.redirect('/');
    next();
  } else {
    response.render('login', {layout: 'login',error:'Invalid Username Or Password'});
  }         
  response.end();

一旦您进入了if循环,并且成功重定向,并且响应已结束。但是Javascript将继续到response.end()的if循环之外的下一行,这就是为什么您看到错误的原因。您也无法调用next(),因为这意味着当您调用response.end()response.redirect

时,在实际上满足您的请求的情况下,请求需要进一步处理

正确的是-

app.post('/login', function(request, response, next) {

 var username = request.body.username;
 var password = request.body.password;
 if (username && password) {
   connection.query('SELECT * FROM users WHERE username = ? AND password = ?',[username, password], function(error, results, fields) {
    console.log(results);
   if (results.length > 0) {
    request.session.loggedin = true;
    request.session.username = username;
    // request.session.w_id = us;
    response.redirect('/');
  } else {
    response.render('login', {layout: 'login',error:'Invalid Username Or Password'});
  }         

} 
else {
response.render('login', {layout: 'login',error:'Please Enter Username And Password'});

}
 });