简体   繁体   中英

Cannot set headers after they are sent to the client error

I have a login form that authenticates using postgresql I'm trying to check if users exists then redirect the client to the other page. The code is:

app.post('/login', (req, res) => {

  var Enteredusername = req.body.username;
  var Enteredpassword = req.body.password;

  pool.query("SELECT * FROM tbl_users WHERE username = $1 AND password = $2", [Enteredusername, Enteredpassword], (err, result) => {
    if (err) return console.log('error in query', err);
    // need to check if user exists
    let user = (result.rows.length > 0) ? result.rows[0] : null;
    if (!user) {

      req.flash('notify', 'This is a test notification.')
      res.render('login', {
        messages: req.flash('Username or Password is incorrect !')
      });
      return res.redirect('/login')

    }
    res.redirect('/posts')

  });
});

And I got the error:

_http_outgoing.js:470 throw new ERR_HTTP_HEADERS_SENT('set');

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client.

How Can I fix it?

It's the async behavior of javascript res.redirect('/posts') is executed before req.flash and res.render you can hack it like this :

req.session.userId = Enteredusername;

if (!user) {

  req.flash('notify', 'This is a test notification.')
  res.render('login', {
    messages: req.flash('Username or Password is incorrect !')
  });

  return res.redirect('/login')

}else{
    return res.redirect('/posts')
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM