Javascript 在nodejs应用程序中单独保留mongoose函数

Javascript 在nodejs应用程序中单独保留mongoose函数,javascript,node.js,mongodb,mongoose,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.pa

我想单独保留一些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)
        })

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


请纠正我,提前谢谢。

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

您必须从
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()
                    })
                });
            });
        })
    }
查看更多信息


希望这有帮助

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

您必须从
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()
                    })
                });
            });
        })
    }
查看更多信息


希望这有帮助

但是我们在哪里运行。save()??这样它就可以保存在mongooseIt中工作了,thx,但是我知道保存发生在哪里??在model.js文件中运行它。那么我不能在createUser函数中运行它吗?如果出现错误,你应该“return-reject(err)”,如果没有return语句,用户仍然会被插入mongo中(至少会执行)但是我们在哪里运行。save()??这样它就可以保存在mongooseIt中工作了,thx,但是我知道保存发生在哪里??在model.js文件中运行它。那么我不能在createUser函数中运行它吗?如果出现错误,你应该“return-reject(err)”,如果没有return语句,用户仍然会被插入mongo中(至少会执行)