sql >> Database teknologi >  >> NoSQL >> MongoDB

Express Mongoose Model.find() returnerer udefineret

Det ser korrekt ud, men du glemmer Javascriptets asynkrone adfærd :). Når du koder dette:

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

Du kan se json-svaret, fordi du bruger en console.log instruktion INDE i tilbagekaldet (den anonyme funktion, som du videregiver til .exec()) Men når du skriver:

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 vil udføre getAllTasks() funktion, der ikke returnerer noget (udefineret), fordi den ting, der virkelig returnerer de data, du ønsker, er INDE i tilbagekaldet...

Så for at få det til at fungere, skal du bruge noget som dette:

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

Og vi kan skrive:

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


  1. MongoDB-aggregat, hvordan man tilføjerToSet hvert element af array i gruppepipeline

  2. Mongo $regex med parentes og ordgrænse

  3. Hvordan Mocha ved, hvilken fil der skal indlæses først i testpakken

  4. Forespørgsel, filtrering og opdatering af indlejrede arrays på flere niveauer i MongoDB ved hjælp af C#