Javascript 从mongo返回普通json对象时出现问题

Javascript 从mongo返回普通json对象时出现问题,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个在模式数据库中查找一个对象的函数。如果输入console.log,则显示正确。但在函数外部,当我使用它或控制台记录它时,它返回一个空对象。请帮忙 我的职能: var pushQues = function(quesObj){ var query = {AnswerId: 'Texas'}; Question.findOne(query).lean().exec(function(err,docs){ console.log(docs.Ques); console.log

我有一个在模式数据库中查找一个对象的函数。如果输入console.log,则显示正确。但在函数外部,当我使用它或控制台记录它时,它返回一个空对象。请帮忙

我的职能:

var pushQues = function(quesObj){ 
var query = {AnswerId: 'Texas'};
Question.findOne(query).lean().exec(function(err,docs){
    console.log(docs.Ques);
    console.log(docs);
    quesObj = docs;
});};
var quesObj={};
pushQues(quesObj);
console.log('and quesobj here: '+ quesObj);
console.log('question here: '+ quesObj.Ques);
var pushQues = function(quesObj){ 
  var query = {AnswerId: 'Texas'};
  Question.findOne(query).lean().exec(function(err,docs){
      console.log(docs.Ques);
      console.log(docs);
      quesObj.result = docs;
  });
};
控制台(正确返回):

正在尝试从外部函数检索quesObj:

var pushQues = function(quesObj){ 
var query = {AnswerId: 'Texas'};
Question.findOne(query).lean().exec(function(err,docs){
    console.log(docs.Ques);
    console.log(docs);
    quesObj = docs;
});};
var quesObj={};
pushQues(quesObj);
console.log('and quesobj here: '+ quesObj);
console.log('question here: '+ quesObj.Ques);
var pushQues = function(quesObj){ 
  var query = {AnswerId: 'Texas'};
  Question.findOne(query).lean().exec(function(err,docs){
      console.log(docs.Ques);
      console.log(docs);
      quesObj.result = docs;
  });
};
控制台(不工作):


我假设您需要这个pushQues函数声明,因为这是一个异步问题

var pushQues = function(quesObj, callback){ 
var query = {AnswerId: 'Texas'};
var quesObj = {} ;
return Question.findOne(query).lean().exec(function(err,docs){
    console.log(docs);
    quesObj = docs;
    callback(null, docs);
});};
调用pushQues函数

pushQues(quesObj,function(err,result){
console.log('and quesobj here: '+ result);
console.log('question here: '+ result.Ques);  

这应该是异步性质的问题,尝试传递
回调来获取它

var pushQues = function(quesObj, callback) {
  var query = {
    AnswerId: 'Texas'
  };
  Question.findOne(query).lean().exec(function(err, docs) {
    console.log(docs.Ques);
    console.log(docs);
    callback(null, docs);
  });
};


pushQues(quesObj,function(err,result){
console.log('and quesobj here: '+ result);
console.log('question here: '+ result.Ques);  
});
更新

var async = require('async');
async.waterfall([
  function(callback) {
    var pushQues = function(quesObj, callback) {
      var query = {
        AnswerId: 'Texas'
      };
      Question.findOne(query).lean().exec(function(err, docs) {
        console.log(docs.Ques);
        console.log(docs);
        callback(err, docs);
      });
    };
  }
], function(err, result) {
if(!err){
  console.log(result);
}
});

问题是您正在替换对象引用。你可以这样说:

var quesObj={ result: null };
pushQues(quesObj);
console.log('and quesobj here: '+ quesObj);
console.log('question here: '+ quesObj.result.Ques);
职能:

var pushQues = function(quesObj){ 
var query = {AnswerId: 'Texas'};
Question.findOne(query).lean().exec(function(err,docs){
    console.log(docs.Ques);
    console.log(docs);
    quesObj = docs;
});};
var quesObj={};
pushQues(quesObj);
console.log('and quesobj here: '+ quesObj);
console.log('question here: '+ quesObj.Ques);
var pushQues = function(quesObj){ 
  var query = {AnswerId: 'Texas'};
  Question.findOne(query).lean().exec(function(err,docs){
      console.log(docs.Ques);
      console.log(docs);
      quesObj.result = docs;
  });
};
另一个选项是使用回调:

var pushQues = function(callback){ 
  var query = {AnswerId: 'Texas'};
  Question.findOne(query).lean().exec(function(err,docs){
      console.log(docs.Ques);
      console.log(docs);
      callback(err, docs);
  });
};



var quesObj={ result: null };
pushQues(function(err, obj) {
  if (err) console.log(err);
  console.log('and quesobj here: '+ quesObj);
  console.log('question here: '+ quesObj.Ques);
});


你能用stringify打印你的第一个控制台,并检查值是否出现
console.log(JSON.stringify(quesObj))
?当你覆盖它,然后分配它时,很明显,它正在得到undefinedUsing stringify我得到了一个undefinedWell,我必须先初始化它,然后才能修改它,对吗?这仍然会返回一个null和undefinedwhat,它是一个输出og
控制台
,用于
pushQues函数
中,它在
问题中返回[object object]make
return
,然后在控制台结果后调用pushQues时,函数内部是什么?如果返回正确的函数,但是外部返回结果承诺{}。此处的问题:未定义因此,对于第一个答案,我的控制台仍然为null且未定义第二个回拨答案:控制台为[object object],未定义以如下方式记录对象:
console.log('and quesobj here:',quesobj)使用逗号而不是加号这项工作,但只能从回调内部进行,是否还要在外部设置一个对象来生成结果?是的,您可以使用promise或async module来获取itOkay。我将进一步研究这一点,并让您知道发生了什么情况async module的瀑布方法。看到我更新的答案谢谢你们,你们让我意识到我需要更好地学习异步。无法告诉您我在这个问题上花了多少小时:)