希望有人能帮我解决这个我确信是菜鸟的错误。
我正试图改编一个最初基于mongodb的身份验证应用,以代替seqeulize\MSSQL工作,但在试图将一个基于回调的工作实例与seqeulize承诺的基于方法相融合的过程中,却陷入了困境。
MongoDb/Sequelize都提供了一个findOne()方法。
引用MongoDb集合的原始(工作)代码。
module.exports.getUserByUsername = function(username,callback){
var query = {username: username};
User.findOne(query,callback);
}
本例中的回调来自单独的调用模块,是 passport.js 的 local-strategy 的标准验证密码。
由于sequelize findOne()方法需要一个where子句,我希望下面是一个开箱即用的解决方案。
module.exports.getUserByUsername = function(username,callback){
var query = {where: {username: username}};
User.findOne(query,callback);
}
这将向 console.log 输出一个功能查询,但回调没有启动,所以页面挂起。
看了一下各自的API文档,似乎sequelize findOne()完全是基于承诺的,而MongoDb findOne()只有在回调函数没有传递给findOne()方法的情况下才会返回一个承诺,否则,当提供了一个回调函数时,就会像工作示例中的情况一样,将流转给回调。
我尝试了下面的改编,以便与sequelize承诺一起工作(以及在.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())会显示出正确的细节,显示数据库查询正确地返回了所需的用户数据,所以我觉得我已经很接近找到正确的语法来将这些数据传递给护照回调了。
任何帮助都将是非常感激的
像这样把raw属性加到true,就可以得到用户对象了。
User.findOne({ where : {username:username}, raw: true}).then( user => {
return user
})