【问题标题】:node.js authentication with sequelize and passport - promise and callback confusionnode.js 身份验证与续集和护照 - 承诺和回调混淆
【发布时间】:2020-05-06 16:07:16
【问题描述】:

希望有人可以帮助我解决我确信是菜鸟的错误。

我正在尝试调整最初基于 mongodb 的身份验证应用程序,改为使用 sequelize\MSSQL,但试图将基于回调的工作示例与 sequelize 的基于承诺的方法。

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 承诺(以及在 .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()) 输出正确的详细信息,显示正确执行的数据库查询返回所需的用户数据,所以我觉得我非常接近找到正确的语法来将其返回给护照回调。

任何帮助将不胜感激!

【问题讨论】:

    标签: mongodb promise callback sequelize.js passport.js


    【解决方案1】:

    这样添加raw属性为true,就可以得到用户对象了

    User.findOne({ where : {username:username}, raw: true}).then( user => {
      return user
    })
    

    【讨论】:

    • 非常感谢您的指导。此选项使用户数据可以立即访问。我仍然得到一个挂起的网页,我认为这是因为回调没有执行。
    • 感谢 Yoga Altariz,它帮助我更进一步,因为我可以在不需要 get() 语句的情况下 console.log 记录返回的用户数据,并将流程交回回调函数.代码仍然中断,因为我在回调中摸索用户数据。现在得到一个
    • 非常感谢 Yoga Altariz,它帮助我更进一步,因为我可以在不需要 get() 语句的情况下 console.log 记录返回的用户数据,并且流程正在交回给回调函数。代码仍然中断,因为我在回调中摸索用户数据。我现在收到一个未处理拒绝错误,因为只有一个对象(用户)被传递给一个匿名回调函数,该函数用两个参数(err,callback)定义,因此努力获取正确的语法以确保两者都返回正确的地方..现在用户被传递给错误。
    • 很高兴听到我的回答可以帮助你。我现在不明白你的问题,也许你可以分享代码
    • 当然,再次感谢。最好的方法是什么?你想通过 Github 看完整代码还是只看两个函数块?
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2014-06-22
    • 2018-11-06
    相关资源
    最近更新 更多