错误 [ERR_HTTP_HEADERS_SENT]:在新的 NodeError (node:internal/errors:371:5) 发送到客户端后无法设置 headers

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at new NodeError (node:internal/errors:371:5)

我在 sign-in 发生后收到此错误。该代码可以正常工作,但在返回用户后出现此错误。

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:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\express\lib\response.js:771:10)
    at ServerResponse.location (C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\express\lib\response.js:888:15)
    at ServerResponse.redirect (C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\express\lib\response.js:926:18)
    at allFailed (C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\passport\lib\middleware\authenticate.js:139:20)
    at attempt (C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\passport\lib\middleware\authenticate.js:174:28)
    at Strategy.strategy.fail (C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\passport\lib\middleware\authenticate.js:296:9)
    at verified (C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\node_modules\passport-local\lib\strategy.js:82:30)

    at C:\Users\Oswald\Desktop\Folders\nodeProjects\practisefolder\nodeWebAppTutorial\src\config\passport.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) => {
        (async function ValidateUser() {
            try {
                const users = await usersRepo.getData({ username: username });
                users.forEach((user) => {
                    if (user.username === username && 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) => {
        done(null, user);
    });
    passport.deserializeUser((user, done) => {
        done(null, user);
    });
}
module.exports = initialize

问题在于 .forEach 中的 return 语句不会停止迭代,因为它只是来自当前的 forEach 回调 returns。 但这不是唯一的问题,因为每次找不到用户时您都会调用 done() 回调。您可能正在寻找这样的东西:

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