sql >> Databáze >  >> NoSQL >> MongoDB

Express Mongoose Model.find() vrací hodnotu undefined

Vypadá to správně, ale zapomínáte na asynchronní chování Javascriptu :). Když zakódujete toto:

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

Odpověď json můžete vidět, protože používáte console.log instrukce INSIDE the callback (anonymní funkce, kterou předáte .exec())Když však zadáte:

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 provede getAllTasks() funkce, která nic nevrací (nedefinováno), protože věc, která skutečně vrací data, která chcete, je UVNITŘ zpětného volání...

Takže, aby to fungovalo, budete potřebovat něco takového:

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

A můžeme napsat:

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. Existuje způsob, jak spustit shell MongoDB (nebo metodu tojson) v přísném režimu JSON?

  2. Rails 4/Devise/MongoDB:Nepovolené parametry využívající vlastní vlastnosti a silné parametry

  3. Mongoose vyberte pole pro návrat z findOneAndUpdate

  4. Získejte hodnotu v odkazu na vyhledávání pomocí MongoDB a Golang