#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"}); }