sql >> データベース >  >> NoSQL >> MongoDB

Express Mongoose Model.find()は未定義を返します

    それは正しいように見えますが、Javascriptの非同期動作を忘れています:)。これをコーディングするとき:

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

    console.logを使用しているため、jsonの応答を確認できます。 コールバック内の命令(.exec()に渡す無名関数)ただし、次のように入力すると:

    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 getAllTasks()を実行します 本当に必要なデータを返すのはコールバックの内側にあるため、何も返さない(未定義の)関数...

    したがって、それを機能させるには、次のようなものが必要になります:

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

    そして、私たちは書くことができます:

    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で、ユーザーが関与する各会話の最後のメッセージを一覧表示する

    2. $andとMultiple$orを使用してMongoDBをクエリします

    3. mongodbをアップグレードする

    4. mongodbへのSQLクエリ?