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