使用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
相关产品推荐
相关产品推荐

