希望有人可以帮助我解决我确定是菜鸟错误的问题。
我正在尝试调整最初基于 mongodb 的身份验证应用程序,改为使用 sequelize\MSSQL,但试图将基于回调的工作示例与
sequelize 的基于 promise 的方法。
MongoDb\Sequelize 都提供了一个 findOne() 方法。
引用 MongoDb 集合的原始(工作)代码:
module.exports.getUserByUsername = function(username,callback){
var query = {username: username};
User.findOne(query,callback);
}
本例中的回调来自一个单独的调用模块,并且是 passport.js 本地策略的标准验证密码。
由于 sequelize findOne() 方法需要一个 where 子句,我希望以下是一个开箱即用的解决方案:
module.exports.getUserByUsername = function(username,callback){
var query = {where: {username: username}};
User.findOne(query,callback);
}
这会将功能查询输出到 console.log,但不会触发回调,因此页面会挂起。
查看相应的 API 文档,似乎 sequelize findOne() 完全基于 Promise,而 MongoDb findOne() 仅在回调函数未传递给 findOne() 方法的情况下才返回 Promise,否则当一个回调函数传递给回调时与工作示例一样提供。
我尝试了以下改编以使用 sequelize promise (以及在 .then() 子句中调用回调函数等的相当多的排列)。但都失败了,页面挂起::
module.exports.getUserByUsername = function(username,callback){
var query = {where: {username: username}};
return User.findOne(query).then(user => {
console.log(user.get({ plain: true }));
return user.dataValues;
//callback(user.dataValues)
}).finally(() => {
console.log('done!')
});
}
console.log(user.get()) 输出正确的详细信息,显示正确执行的数据库查询返回所需的用户数据,所以我觉得我非常接近找到正确的语法来将其传递回 Passport 回调.
任何帮助将非常感激!
最佳答案
像这样添加raw属性为true,就可以得到用户对象了
User.findOne({ where : {username:username}, raw: true}).then( user => {
return user
})
关于mongodb - node.js 身份验证与 Sequelize 和 Passport - promise 和回调混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61594219/