我想分别保留一些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()不是函数”
请提前纠正我。
答案 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了解详情。
希望这有帮助!