Mongoose查询回调返回?

问题描述 投票:0回答:2

这是一个普遍的问题,但为什么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);
node.js mongoose
2个回答
2
投票

由于Node.jsasynchronous 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
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.