MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Express Mongoose Model.find() gibt undefiniert zurück

Das sieht richtig aus, aber Sie vergessen das asynchrone Verhalten von Javascript :). Wenn Sie dies codieren:

module.exports.getAllTasks = function(){
        Task.find().lean().exec(function (err, docs) {
        console.log(docs); // returns json
    });
}

Sie können die json-Antwort sehen, weil Sie eine console.log verwenden Anweisung INNERHALB des Rückrufs (die anonyme Funktion, die Sie an .exec() übergeben) Wenn Sie jedoch Folgendes eingeben:

app.get('/get-all-tasks',function(req,res){
    res.setHeader('Content-Type', 'application/json');
    console.log(Task.getAllTasks()); //<-- You won't see any data returned
    res.json({msg:"Hej, this is a test"}); // returns object
});

Console.log führt getAllTasks() aus Funktion, die nichts (undefiniert) zurückgibt, weil das Ding, das wirklich die Daten zurückgibt, die Sie wollen, INNERHALB des Callbacks ist...

Damit es funktioniert, brauchen Sie also so etwas:

module.exports.getAllTasks = function(callback){ // we will pass a function :)
        Task.find().lean().exec(function (err, docs) {
        console.log(docs); // returns json
        callback(docs); // <-- call the function passed as parameter
    });
}

Und dann können wir schreiben:

app.get('/get-all-tasks',function(req,res){
    res.setHeader('Content-Type', 'application/json');
    Task.getAllTasks(function(docs) {console.log(docs)}); // now this will execute, and when the Task.find().lean().exec(function (err, docs){...} ends it will call the console.log instruction
    res.json({msg:"Hej, this is a test"}); // this will be executed BEFORE getAllTasks() ends ;P (because getAllTasks() is asynchronous and will take time to complete)
});