Ошибка [ERR_HTTP_HEADERS_SENT]: Не удается установить заголовки после их отправки клиенту при новой ошибке узла (узел:внутренний/ошибки:371:5)

#node.js #passport.js

Вопрос:

Я получаю эту ошибку после того, как произошел вход в систему. Код работает так, как должен, но после того, как пользователь возвращается, я получаю эту ошибку.

 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client  at new NodeError (node:internal/errors:371:5)  at ServerResponse.setHeader (node:_http_outgoing:576:11)  at ServerResponse.header (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulesexpresslibresponse.js:771:10)  at ServerResponse.location (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulesexpresslibresponse.js:888:15)  at ServerResponse.redirect (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulesexpresslibresponse.js:926:18)  at allFailed (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulespassportlibmiddlewareauthenticate.js:139:20)  at attempt (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulespassportlibmiddlewareauthenticate.js:174:28)  at Strategy.strategy.fail (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulespassportlibmiddlewareauthenticate.js:296:9)  at verified (C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialnode_modulespassport-locallibstrategy.js:82:30)   at C:UsersOswaldDesktopFoldersnodeProjectspractisefoldernodeWebAppTutorialsrcconfigpassport.js:17:32  

Код

 const usersRepo = require('../repositories/usersRepo'); const { Strategy } = require('passport-local');  function initialize(passport) {   passport.use('local.signIn', new Strategy({  usernameField: 'username',  passwordField: 'password'  }, (username, password, done) =gt; {  (async function ValidateUser() {  try {  const users = await usersRepo.getData({ username: username });  users.forEach((user) =gt; {  if (user.username === username amp;amp; user.password === password) {  return done(null, user)  } else {  return done(null, false, { message: "user not found" })  }  })   } catch (error) {  done(error, false)  }   }())  }))   passport.serializeUser((user, done) =gt; {  done(null, user);  });  passport.deserializeUser((user, done) =gt; {  done(null, user);  }); } module.exports = initialize  

Ответ №1:

Проблема в том, что return инструкция внутри .forEach не останавливает итерацию, так как она просто возвращается из текущего обратного вызова forEach. Это не единственная проблема, хотя, поскольку вы вызываете done() обратный вызов каждый раз, когда пользователь не найден. Вы, вероятно, ищете что-то подобное вместо этого:

 const userFound = users.find(user =gt; user.username === username amp;amp; user.password === password); if (userFound) {  done(null, user);  } else {  done(null, false, {message: "user not found"}); }