2016-10-30 4 views
0

Ich habe eine Funktion, die ein Objekt in meiner Schemadatenbank findet. Wenn ich es console.log, wird es korrekt angezeigt. Aber außerhalb der Funktion, wenn ich es benutze oder die Konsole logge, gibt es ein Null-Objekt zurück. Bitte helfenProblem beim Zurückgeben plain json Objekt von Mongo

Meine Funktion:

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; 
});}; 

Console (Kosten korrekt):

Which is the biggest state? 
{ _id: 5815366d49fd95ec160728d8, 
Ques: 'Which is the best language?', 
Answers: [ 'Texas', 'Georgia', 'New york', 'Ohio' ], 
AnswerId: 'Texas' } 

Versuch quesObj von außen Funktion abzurufen:

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

Konsole (nicht funktioniert):

and quesob here: [object Object] 
quesob here: undefined 
+0

Können Sie Ihre erste Konsole mit stringify drucken und prüfen Sie den Wert kommt oder nicht 'console.log (JSON.stringify (quesObj))'? – abdulbarik

+0

wie Sie es überschreiben und dann zuweisen, die offensichtlich undefiniert wird –

+0

Mit stringify bekam ich eine undefined –

Antwort

1

Es sollte versuchen, die Frage der Asynchron Natur sein die callback übergeben, um es zu bekommen.

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); 
}); 

aktualisieren

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); 
} 
}); 
+0

Funktioniert das aber nur innerhalb des Rückrufs, Gibt es trotzdem ein Objekt außerhalb zu setzen? –

+0

Ja, Sie können Versprechen oder Async-Modul verwenden, um es zu bekommen – abdulbarik

+0

Okay, ich werde das ein wenig mehr erforschen und Sie wissen lassen, was passiert –

1

ich Sie gehe davon aus wollen diese pushQues funktionieren Erklärung, wie es eine Frage der async ist

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); 
});}; 

Aufruf pushQues Funktion

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

Das sendet immer noch eine Null undefined –

+0

Was ist eine Ausgabe von 'Konsole', die in' pushQues funtion' verwendet wird –

+0

Es gibt [Objekt Objekt] –

1

Das Problem ist, dass Sie die Objektreferenz ersetzen. Sie können diese mögen:

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

Die Funktion:

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; 
    }); 
}; 

Eine weitere Option ist Rückruf verwenden:

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); 
}); 
+0

Also für die erste Antwort war meine Konsole immer noch null undefined –

+0

Die zweite Antwort mit dem Rückruf: Konsole war [Objekt Objekt] und undefined –

+0

Versuchen Sie, das Objekt wie folgt zu protokollieren: 'console.log ('und quesobj hier:' , quesObj); 'mit einem Komma anstelle eines Pluszeichens –

Verwandte Themen