Node.js express 之mongoose 从异步回调函数返回值,类似于同步

慕容弘懿
2023-12-01
Node.js是很好,异步回调模式返回值让我头疼不已啊,今日还是写下今天学习的成果,起由是因为在使用mongoose查询的时候,多个查询相互依赖会层层嵌套,看起来N不爽,我们可以使用并行查询完毕然后,返回想要的结果即可,代码看起来会美观很多,例如:
1
2
3
4
5
User.findOne({userid:userid}, function (err,findUser){
     Group.find({userid:findUser.userid}, function (err,group){
         GroupQZ.find(groupid:group.groupid}. function (err,qz){}
     })
});

以上可以使用eventproxy来并行处理。在一个函数里把三个返回的参数合并成一个json返回。

看我设计的就是死活得不到想要的值,懂的一看便知道怎么回事

1
2
3
4
5
6
7
module.exports.findUser =  function (condition){
     var  userinfo;
     User.findOne(condition, function (err,findUser){
         userinfo = findUser;
     });
     return  userinfo; //返回的结果始终是undefined
};


javascript是按照顺序解析的,到查询的时候是异步执行还没有赋值就直接返回了。

我想要的理想设计方法

1
2
3
4
module.exports.findUser=  function (condition)
{
     return  info; //意思些一个通用函数,传回条件直接返回想要的结果
};


查了很久还是找到很多解决办法,比如这篇文章http://www.cnblogs.com/rubylouvre/p/3292745.html,讲述node.js的promise库对如何取得异步回调函数,加载模块依赖等等。

解决办法:https://npmjs.org/package/express-promise

            https://github.com/kriszyp/node-promise

promise解决方案排名:https://nodejsmodules.org/tags/promises

原来mongoose自带的promise也可以解决:

1
2
3
4
5
6
7
8
9
10
11
//Utility function (put it in a better place)
   var  saveInPromise =  function  (model) {
 
     var  promise =  new  mongoose.Promise();
 
     model.save( function  (err, result) {
       promise.resolve(err, result);
     });
 
     return  promise;
   }

Then you can use it instead of save to chain your promises

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   var  User = mongoose.model( 'User' );
   var  Channel = mongoose.model( 'Channel' );
   var  Article = mongoose.model( 'Article' );
 
   //Step 1
   var  user =  new  User({data:  'value' });
   saveInPromise(user).then( function  () {
 
     //Step 2
     var  channel =  new  Channel({user: user.id})
     return  saveInPromise(channel);
 
   }).then( function  (channel) {
 
     //Step 3
     var  article =  new  Article({channel: channel.id})
     return  saveInPromise(article);
 
   },  function  (err) {
     //A single place to handle your errors
 
   });


 类似资料: