ошибка перенаправления [ERR_HTTP_HEADERS_SENT]: не удается установить заголовки после их отправки клиенту

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Продолжайте получать эту ошибку, указывающую на res.redirect … Я думал, что добавление ‘return’ исправит это, поскольку это позволяет завершить промежуточное программное обеспечение, но ошибка сохраняется

вот функция

 app.post('/login', (req,res) => {
   //set this up with passport ideally... auth with db 
   var username = req.body.email
   var password = req.body.password
  
   User.findOne({email:username})
   .then(user => {
      if(user) {
         bcrypt.compare(password, user.password, function(err, result) {
            if(err) {
               //maybe send this back in res json?
               console.log(err)
               return res.redirect('/login')
            }
            else if(result){
               //let token = jwt.sign({name:user.name}, )
               req.session.user = user.dataValues
               console.log('Login successful')
               return res.redirect('/dashboard');       //error happening here
            }else {
               console.log('Password does not match')
               return res.redirect('/login')
            }
         })
      }
   })
   res.redirect('/')
})
  

И вот мой вывод

 Login successful
undefined:0



Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:533:11)
    at ServerResponse.header (/Users/sherm/Documents/daily_email/node_modules/express/lib/response.js:771:10)
    at ServerResponse.location (/Users/sherm/Documents/daily_email/node_modules/express/lib/response.js:888:15)
    at ServerResponse.redirect (/Users/sherm/Documents/daily_email/node_modules/express/lib/response.js:926:18)
    at /Users/sherm/Documents/daily_email/server.js:79:27 {
  code: 'ERR_HTTP_HEADERS_SENT'
}
npm ERR! code ELIFECYCLE
  

Комментарии:

1. Почему у вас res.redirect('/') внизу? Удалите его.

Ответ №1:

Проблема в том, что вы вызываете res.redirect('/') (строка 27 вашего примера), прежде User.findOne(...).then чем запускается. Следовательно, в случае, если пользователь найден, заголовки ваших результатов уже отправлены этим перенаправлением.

Вместо этого попробуйте это:

 ...
User.findOne({email:username})
   .then(user => {
      if(user) {
        ...
      } else
        res.redirect('/')
   })
...