这是一个普遍的问题,但为什么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
在asynchronous way
中被执行,如果你的userInfo
得到很长时间,它有时无法在query
得到结果。然后为了确保
userInfo
值,你必须使用callback
或Promise
。
有关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/
您正在使用异步操作,这意味着您无法返回该值,因为当Node环境到达您的return语句时不存在任何值。
数据库操作需要时间,在此期间,您的数据库查找代码已完成执行,Node正在完成当前调用堆栈中的代码,处理从Node事件队列获取的另一个任务,或处于空闲状态。
返回db值后,回调将放在Node事件队列中,准备好由Node环境使用并打印到控制台。
如果有,在数据库查找调用和返回的数据库值之间有另一个url请求,Node将设置一个工作线程来处理数据库请求,另一个处理数据库操作。当工作人员完成任务(URL请求和数据库查找)时,它会将回调推送到事件队列。当没有Node要读取的代码(堆栈为空)时,它会转到事件队列并按顺序执行这些任务。