使用promises在nodejs app中单独保存mongoose函数

时间:2018-03-03 07:30:01

标签: javascript node.js mongodb mongoose

我想分别保留一些mongoose功能以获得更好的代码,我想处理承诺,下面是一个例子。

Model.js文件

var User = module.exports = mongoose.model('User', UserSchema);

module.exports.createUser = function(newUser, callback){
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(newUser.password, salt, function(err, hash) {
            newUser.password = hash;
            newUser.save(callback); 
        });
    });
}

这里createUser是一个自定义函数,我的route.js如下所示,

router.post('/register', function(req, res){
    var newUser = new User({
        email: req.body.email,
        password: req.body.password
    });

    User.createUser(newUser)
        .then(function(user){
            console.log(user)
            res.redirect('/users/login');
        })
        .catch(function(err){
            console.log(err)
        })

})

对于promises,这显示错误“.then undefined”和“.save()不是函数”

请提前纠正我。

1 个答案:

答案 0 :(得分:3)

这不起作用,因为createUser(..)未返回promise。为了使.then()起作用,它应该链接到一个返回一个promise的函数。

您必须从createUser()返回承诺:

module.exports.createUser = function(newUser){
    return new Promise((resolve,reject)=>{
        bcrypt.genSalt(10, function(err, salt) {
            bcrypt.hash(newUser.password, salt, function(err, hash) {
                if(err){reject(err);}// err is passed on to the catch() call
                newUser.password = hash;
                resolve(newUser); // newUser is passed on to the then() call chained after the call to createUser()
            });
        });
    })
}

这应该有效:

module.exports.createUser = function(newUser){
        return new Promise((resolve,reject)=>{
            bcrypt.genSalt(10, function(err, salt) {
                bcrypt.hash(newUser.password, salt, function(err, hash) {
                    if(err){reject(err);}// err is passed on to the catch() call
                    newUser.password = hash;
                    newUser.save(function(err, newUser){
                        if(err){return reject(err);}                        
                        resolve(newUser); // newUser is passed on to the then() call chained after the call to createUser()
                    })
                });
            });
        })
    }

查看promises了解详情。

希望这有帮助!