javascript - 出现错误 : cannot set headers after they are sent to the client

标签 javascript node.js express

我最近使用 bcrypt 在我的网站上添加了身份验证。进行身份验证时,bcrypt 会比较密码。

如果密码匹配,req.session 将设置为 cookie 并使用 connect-mongodb-session 写入 mongodb。但是,当重定向到 /events 时,应用程序崩溃并给出错误:错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置 header

我正在使用 Handlebars 来渲染我的 html 代码

验证路线:

Router.get('/', (req, res) => {
  res.status(200).render('login', {pageTitle: 'Log In'});
})

Router.post('/', (req, res) => {
  //Authenticate user
  const username = req.body.username;
  const pass = req.body.password;

  User.findOne({username: username}).then((user) => {
    if (user) {
      //Validate password
      console.log(user);
      console.log(user.password);
      bcrypt.compare(pass, user.password).then((doMatch) => {
        console.log(doMatch);
        //Check if password match
        if (doMatch) {
          //To use session use express-session package
          req.session.isLoggedIn = true;
          req.session.user = user;
          req.session.save((err) => {
            console.log(err);
            res.redirect('/');
          });
          return res.redirect('/events');
        } else {
          res.redirect('/');
        }
      }).catch((err) => {
        console.log(err);
      });
    } else {
      return res.redirect('/');
    }
  }).catch((err) => {
    console.log(err);
  });

});

事件路线:

Router.get('/events', (req, res) => {
  if (req.session.isLoggedIn) {

  Event.find({}, (err, events) => {
    res.render('events', {
      prods: events,
      pageTitle: 'Events',
      path: '/events',
      hasProducts: events.length > 0
    });
  }).catch((err) => {
    console.log(err);
  });

} else {
  console.log('User not authenticated');
  res.status(401).send('User not authenticated');
}

});

最佳答案

这些行是罪魁祸首。

req.session.save((err) => {
            console.log(err);
            res.redirect('/');
          });
          return res.redirect('/events');

在这里,您将回调传递给 save 并立即重定向 res.redirect('/events')。 一段时间后,回调重定向 res.redirect('/'); 抛出错误。

关于javascript - 出现错误 : cannot set headers after they are sent to the client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240356/

相关文章:

javascript - 我如何估计我的 gzip 脚本的大小?

javascript - 发送后无法设置 header - NodeJS

javascript - 如何在不使用长度函数的情况下创建测量字符串长度的长度函数

javascript - 将数据从部分获取到 Controller 的 Angular 方式是什么?

node.js - 如何将 'process.on' 更改为基于 RxJS 风格的事件?

node.js - 无法下载 node-sass HTTP 错误 404 Not found --- Node Gyp 错误

javascript - 当我与比特币平均服务器通信时,它显示 403 状态代码错误

Node.js + Express : Routes vs controller

node.js - 当 req body json 太重时 ExpressJS CORS 错误

javascript - 垂直滚动 Stellar JS 上的水平位置移动