You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Passport.js实现注册时出现LocalStrategy错误求助

Passport.js本地注册策略报错:数据库插入成功但仍抛出错误

你在使用Passport.js的LocalStrategy实现注册功能时,遇到了数据库成功插入用户数据,但代码仍抛出错误的问题:数据库已接收newUser数据,但控制台出现Pool.query相关的错误栈。

问题原因

核心问题是没有调用Passport策略的done回调函数。Passport的验证回调必须通过done函数来结束流程——不管操作成功还是失败,都需要调用它通知Passport流程完成。如果不调用done,Passport会一直等待回调结束,最终触发异步超时或未处理的Promise异常,这就是你看到的错误来源。

修正后的代码

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const pool = require('../database');
const helpers = require('../lib/helpers');

passport.use('local.signup', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true         
}, async (req, username, password, done) => {
    try {
        const { fullname } = req.body;
        const newUser = {
            username: username,
            password: password,
            fullname
        };
        newUser.password = await helpers.encryptPassword(password);
        const result = await pool.query('INSERT INTO users set ?', [newUser]);
        console.log(result);
        
        // 调用done回调,传递用户信息(将数据库返回的插入ID关联到用户对象)
        newUser.id = result.insertId;
        return done(null, newUser);
    } catch (err) {
        // 捕获所有异常并传递给Passport处理
        return done(err);
    }
}));

关键说明

  • done(null, newUser):第一个参数为null表示无错误,第二个参数是验证通过的用户对象,Passport会自动将该对象序列化到Session中。
  • 用try/catch包裹所有异步操作,确保加密、数据库查询过程中出现的任何错误都能被捕获并传递给done,避免未处理的Promise异常。
  • 你提到数据库已成功接收数据,说明INSERT操作本身无问题,只是Passport的流程没有正确收尾。

内容的提问来源于stack exchange,提问作者Ivan Carrion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:05:25