Mongoose查询回调返回?

时间:2016-09-07 05:25:00

标签: node.js mongoose

这是一个普遍的问题,但为什么mongoose查询功能在,例如:

var myFunc = function(username, callback){
    User.findOne({username: username}, 'username name, password', function(err, user){
      callback(user);
    });
};

myFunc('somename', function(userInfo){
    console.log(userInfo);
});

需要另一个函数来返回用户吗?为什么我不能简单地说:

var myFunc = function(username){
    User.findOne({username: username}, 'username name, password', function(err, user){
      return user;
    });
};

var userInfo = myFunc('somename');
console.log(userInfo);

2 个答案:

答案 0 :(得分:2)

  

Node.js执行asynchronous way时,如果您的userInfo获得很长时间,则有时无法在query中获得结果。

     

然后,为了确保userInfo值,您必须使用callbackPromise

有关Node.js asynchronous nature的详细信息,请参阅此处

http://www.sohamkamani.com/blog/2016/03/14/wrapping-your-head-around-async-programming/] 1

https://blog.risingstack.com/node-hero-async-programming-in-node-js/

答案 1 :(得分:1)

您正在使用异步操作,这意味着您无法返回该值,因为当Node环境到达您的return语句时不存在任何值。

数据库操作需要时间,在此期间,您的数据库查找代码已完成执行,Node正在完成当前调用堆栈中的代码,处理从Node事件队列获取的另一个任务,或处于空闲状态。

返回db值后,您的回调将被放置在节点事件队列中,准备好由Node环境使用并打印到控制台。

如果有,那么您的数据库之间会有另一个url请求 查询调用和返回的数据库值,Node将设置一个工作线程来处理您的数据库请求,另一个处理数据库操作。当工作人员完成任务(URL请求和数据库查找)时,它会将回调推送到事件队列。当没有Node要读取的代码(堆栈为空)时,它会转到事件队列并按顺序执行这些任务。