如何使用promises链接mongoose查询?

嘿家伙我是初学者,我正在我的第一个快速和mongo应用程序,但我不知道如何链接查询与JavaScript的承诺,使其工作作为同步查询。 请帮我链接这些mongoose的查询。

/* POST Register User */ router.post('/register',function(req,res,next){ let user = req.body; //checking for empty field in a form for(let key in user){ if(user[key] === ""){ return next(mid.error("All fields are required to fill")); } } User.findOne({username:user.username}) .exec(function(err,user){ if(err){ return next(mid.error("Something went wrong")); } if(user){ return next(mid.error("Username already exist")); } }); User.findOne({email:user.email}) .exec(function(err,user){ if(err){ return next(mid.error("Something went wrong")); } if(user){ return next(mid.error("Email already exist")); } }); //matching password if(user.password !== user.confirm){ return next(mid.error("Password not matched.Try again !")); } //save data in object let userData = { username : user.username, email : user.email, password : user.password }; //save data in database User.create(userData,function(err,user){ if(err){ return next(mid.error("Something went wrong.Try again !!!")); } else { req.session.userID = user._id; return res.redirect('/home'); } }); }); 

 /* POST Register User */ router.post('/register',function(req,res,next){ let user = req.body; let validError = []; //checking for empty field in a form for(let key in user){ if(user[key] === ""){ return next(mid.error("All fields are required to fill")); } } let findUserName = () => { return new Promise(function(resolve,reject){ User.findOne({username:user.username}) .exec(function(err,user){ if(err){ validError.push("Something went wrong"); } if(user){ validError.push("Username already exist"); } return resolve(); }); }); } let findUserEmail = () => { return new Promise(function(resolve,reject){ User.findOne({email:user.email}) .exec(function(err,user){ if(err){ validError.push("Something went wrong"); } if(user){ validError.push("Email already exist"); } return resolve(); }); }); } let isPasswordMatch = () => { return new Promise(function(resolve,reject){ if(user.password !== user.confirm){ validError.push("Password not matched"); } return resolve(); }); } findUserName().then(findUserEmail).then(isPasswordMatch).then(() => { if(validError.length == 0){ //save data in object let userData = { username : user.username, email : user.email, password : user.password }; //save data in database User.create(userData,function(err,user){ if(err){ return next(mid.error("Something went wrong.Try again !!!")); } else { req.session.userID = user._id; return res.redirect('/home'); } }); }else{ return next(mid.error(validError[0])); } }); }); 

终于做了我自己的! 感谢大家

承诺链接并不总是有利的,你必须分析链接是否会支持你的情况或将恶化你的问题。 在你的情况下,如果任何查询{findByName,findByEmail,Create}失败,你必须从那里返回。 如果你用promise来链接,那么如果上面的任何操作都失败了,那么下一个链接的promise就会被连续的执行。 所以在我看来,所有你需要的是Promise.all 。 下面我提供了jsfiddle上的代码链接。 为了您的理解,我给了链接的方法,但不build议。 只要去与Promise.all

与Promise.all

与承诺链接

使用Rx和mongoose可观察的:)

 var Rx = require('rx'); var observables = require('mongoose-observables'); /* get public header data, list of collections and projects */ router.get("/header", function(req, res) { let articleTitle = observables.finder.find(Articles, '{}', ['title'], null); let collectionTitle = observables.finder.find(Collections, '{}', ['title'], null); Rx.Observable.forkJoin([articleTitle, collectionTitle]) .subscribe( (docs) => res.json(docs), (err) => console.error(err) ); 

});

更多示例在https://www.npmjs.com/package/mongoose-observables