繁体   English   中英

如何调用一个根据诺言的结果返回诺言的函数?

[英]How to call a function returning a promise on a result of a promise?

我有一个基本的猫鼬身​​份验证,使用bcryptjs哈希密码。 bcrypt和猫鼬都返回承诺。 在我的routes.js中,我有以下脚本,该脚本在数据库中找到用户后卡住了:

routes.post('/auth', (req, res)=> {
    User.findOne({'local.username': req.body.username})
        .then(
            user=> Promise.all([user, user.validate(req.body.password)])
        )
        .then(
            results => {
                console.log(results);
                res.json({token: jwt.sign({id: results[0]._id}, config.secret)});
            }
        )
        .catch(
            err=> console.log(err)
        );
});

如您所见,我找到了用户,然后尝试调用其validate方法(将被调用),但它不会解决诺言,也不会引发错误。 在定义UserSchema的user.js中,我具有以下代码来比较密码:

UserSchema.methods.validate = function (password) {
    return bcrypt.compare(password, this.local.password);
};

这被称为,但是返回的promise似乎消失了,它没有被解析,并且从不记录结果变量。

还有一件事,如果我将用户验证代码编辑为此:

UserSchema.methods.validate = function (password) {
    return bcrypt.compare(password, this.local.password).then(
        results => {
            console.log(results)
        }
    )
};

我确实登录到控制台,所以它一定可以正常工作,但是我不想在这里解决我的诺言,我想在路由器中附加.then(...),这是不可能的吗?

我究竟做错了什么?

更新:

如果将compare方法放到route.js中,它可以工作,但是那不是我想要的,我想将其保留在user.js中,但是我认为这可能指出了我仍然看不到的问题。 我想我必须立即在promise上调用then(),但是我不明白为什么。

 User.findOne({'local.username': req.body.username})
        .then(
            user=> Promise.all([user, bcrypt.compare(req.body.password,user.local.password)])
        )
        .then(
            results => {
                console.log(results);
                res.json({token: jwt.sign({id: results[0]._id}, config.secret)});
            }
        )
        .catch(
            err=> console.log(err)
        );

首先,为什么在这里使用Promise.all? 特别是我不认为需要做类似Promise.resolve(user)事情。 不知道user.validate是如何工作的,我会这样写

routes.post('/auth', (req, res)=> {
    let userId

    User.findOne({'local.username': req.body.username})
    .then(user => {
      userId = user._id
      return user.validate(req.body.password)
    })
    .then(results => {
      console.log(results);
      res.json({token: jwt.sign({id: userId}, config.secret)});
    })
    .catch(err => console.log(err))
});

我发现问题出在猫鼬身上。 它包装了模块方法,并承诺在某处“迷路”。 解决方案是使用同步比较方法或提供回调。

我也在github上创建了一个问题: https : //github.com/Automattic/mongoose/issues/4856

您对Promise并没有做任何事情。

代替

user=> Promise.all([user, user.validate(req.body.password)])

然后,您应该:

user.validate(req.body.password)
.then(results => {
    // Do stuff with results here...
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM