MongoDB Query: я не могу получить объект результата вне области обратного вызова - PullRequest
0 голосов
/ 19 мая 2019

Я использую экспресс-API, подключенный к MongoDB, и когда я запрашиваю БД для получения результата, я могу использовать их только в рамках обратного вызова и даже назначаю значение результата глобально объявленной переменной, когда используя console.log (), результат не определен

вот мой код

const MongoClient = require('mongodb').MongoClient;

const express = require('express');
const assert = require('assert');

const app = express();
const PORT = process.env.PORT||13000;



app.get('/',(req,res) => {

        let myIncomingData;

const url = 'mongodb://localhost:27017/';
        MongoClient.connect(url,{useNewUrlParser:true},(err,db)=>{
        assert.equal(err,null);
        db.db('my_posts').collection('posts').find().toArray((err,result) =>{
         assert.equal(err,null);
         console.log(result);       // here the result gets printed 
         myIncomingData = result;
        }); // db.collection
   db.close();



        }); // MongoClient.connect
        console.log(myIncomingData);  //  print undefined  why ??
}) // app.get


app.listen(PORT,()=>console.log('server is running ...'))

1 Ответ

0 голосов
/ 19 мая 2019
Узел

является асинхронным, поэтому в то время, когда вы выполняете console.log, myIncomingData все еще не определен (вы можете даже увидеть это по порядку console.logs - сначала он будет регистрировать, что неопределенное изэтот второй console.log, а затем он будет регистрировать console.log, который находится в обратном вызове).Если вы хотите увидеть это в действии, вы можете попробовать сделать что-то вроде setTimeout(() => console.log(myIncomingData), 5 * 1000) - задержав 5 секунд, вы можете быть уверены, что код обратного вызова будет запущен, и если вы захотите сделать что-нибудь еще с этим значением,вам нужно будет сделать это из-за обратного вызова (либо встроенного, либо вызвав другую функцию)

async/await или Promises может создать такой кодлегче читать и рассуждать о.Если вы хотите продолжать использовать обратные вызовы, стоит взглянуть на учебник по обратным вызовам, чтобы убедиться, что вы понимаете, что с ними происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...