javascript - Node.js Mongoose Promise 迷路了

标签 javascript node.js mongoose promise bcrypt

我有一个带有 mongoDB 的 Node.js API。有一个创建用户并需要散列密码的路由,为此我使用 bcryptjs 包。

路线是这样的:

router.route('/user')

    .post(function(req, res) {
        if(req.body.password === req.body.passwordConfirm) {
            userManager.addUser(req.body)
                .then(function(response) { // waiting for the result of the mongoDB save
                    res.send({data:response});
                });
         } else {
             res.send({err:'passwords do not match'});
         }
     })

和 userManager.addUSer:

this.addUser = function(userobject) {
    bcrypt.genSalt(10, function(err, salt) { // generate a salt
        if(err !== null) {
            console.log(err);
        } else {
            bcrypt.hash(userobject.password_hash, salt, function(err, hash) { // hash pw
                if(err !== null) {
                    console.log(err);
                else {
                    userobject.password_hash = hash; // store hash in user obj
                    var user = new User(userobject);
                    return user.save().catch(function(err){ // save user in mongoDB
                        console.log(err);
                    });
                }
            });
        }
    });
};

我收到一条错误消息:“无法读取未定义的‘then’属性”,这告诉我我没有收到来自 addUser 的 promise 。我看了看,bcryptjs 可悲的是不使用 promise ,但是,mongoose 确实如此。 (添加这个:

var mongoose = require('mongoose').Promise = Promise;

没有帮助)

我尝试使用 reject 和 resolve 将函数包装在一个 promise 中,但这给出了这个错误:“TypeError: Promise resolver undefined is not a function”。

我如何获得 mongoose 的 save() 函数返回到 post 路由中的 .then() 的 promise ?我尝试在两个 bcrypt 函数前添加 return 但这也不起作用..

欢迎提出任何建议!

最佳答案

你的 addUser函数永远不会将 promise 返回给它的调用者。你在做 return来自 bcrypt.hash回调函数,但这与 addUser 无关的返回值。

看起来像addUser必须使用一些不支持 Promise 的 API,所以你只能做 new Promise ,像这样(参见 *** 评论):

this.addUser = function(userobject) {
    return new Promise(function(resolve, reject) { // ***
        bcrypt.genSalt(10, function(err, salt) { // generate a salt
            if(err !== null) {
                reject(err);                       // ***
            } else {
                bcrypt.hash(userobject.password_hash, salt, function(err, hash) { // hash pw
                    if(err !== null) {
                        reject(err);               // ***
                    else {
                        userobject.password_hash = hash; // store hash in user obj
                        var user = new User(userobject);
                        resolve(user.save());      // *** save user in mongoDB
                    }
                });
            }
        });
    });
};

另请注意,我没有 addUser只是吞下错误;相反,它们被传播给调用者。调用者应该处理它们(即使“处理”只是记录日志)。

关于javascript - Node.js Mongoose Promise 迷路了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46422171/

相关文章:

javascript - 样式类的BackgroundImage对象没有被触发

javascript - 如何在服务、技能、组合等中添加滑动效果?

node.js - Socket.io:覆盖的generateId()被执行,但返回的id似乎被忽略

javascript - node.js 中未记录的 response.finished

javascript - 对 MongoDB 的多个 mongoose count() 查询

node.js - 如何使用 Nestjs 中的请求范围提供程序动态更改数据库连接?

node.js - Mongoose 无法连接到本地主机 : MongoError: failed to connect to server [127. 0.0.1:27017]

javascript - 用于混合应用程序的 Aurelia.io

javascript - 如何将处理程序/函数附加到不同的对象

node.js - 如何将 Telegram 的 TDlib 与 Node.js 结合使用