Монго доступен только после второго запроса API - PullRequest
0 голосов
/ 05 января 2019

Я хочу зачитать базу данных mongodb с API URL. Когда я открываю / showdb в моем браузере, json отображается только после второго обновления. Как я могу получить это в первый раз? Спасибо!

const express = require("express");
const app = express();

var mongo = require('mongodb');


var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";

var resultdb;

function readDB() {
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var dbo = db.db("simpledb");
      dbo.collection("simplecollection").find().toArray(function(err, result) {
        if (err) throw err;
        resultdb = result;
        db.close();
      });
    });

    return resultdb;
};

//handle normal file requests etc.
app.use(express.static(__dirname + "/"));

app.get('/showdb', function(req, res) {
    res.send(readDB());
});

app.listen(10008);
console.log("Server running on port: " + 10008);

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Проблема с кодом заключается в том, что он не ждет, пока readDB() завершит выполнение своих задач с Mongodb, и вернется с пустым, поскольку resultdb только что определено.

Но когда вы вызываете его один раз, после того, как запрос будет обработан, readDB() получит данные от Mongodb, и он будет установлен на resultdb. В следующий раз, когда вы вызываете API, вы получите результат, обработанный в предыдущем вызове API, а не новый.

Попробуйте это -

app.get('/showdb', async function(req, res) {
  const result = await readDB(); // here we are waiting for the results to finish using await.
  res.send(result);
});

и ваша функция readDB работает как -

async function readDB() { // making using of async here.
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        const dbo = db.db('simpledb');
        dbo.collection('simplecollection').find().toArray(function(err, result) { 
            if (err) throw err;
            resultdb = result;
            return resultdb; // we can now return it.
            db.close();
        });
    });
};

Примечание. Учитывая, что вы используете обновленную версию Node с поддержкой async - await

--- ОБНОВЛЕНИЕ ----

Вы можете попробовать это -

app.get('/showdb', async function(req, res) {
    readDB(req, res);
});

function readDB(req, res) { // making using of async here.
    MongoClient.connect(url, function(err, db) {
        if (err){
            res.send(err);
            throw err;
        }
        const dbo = db.db('simpledb');
        dbo.collection('simplecollection').find().toArray(function(err, result) { 
            if (err){
                res.send(err);
                throw err;
            }
            res.send(result)
            db.close();
        });
    });
};
0 голосов
/ 05 января 2019

Вам нужно использовать обратные вызовы, которые вы не можете использовать синхронный код. Как это:

app.get('/', (req, res) => {
  MongoClient.connect(url, (conn, err) => {
    conn.db('foo').collection('bar').find().toArray((err, result) => {
      res.send(result)
    })
  })
})

Функции обратного вызова выполняются позже, поэтому они являются обратными вызовами. Если вы хотите написать код, который больше похож на синхронный код, посмотрите API обещаний и ожидайте

0 голосов
/ 05 января 2019

Здесь происходит то, что вы возвращаете resultdb, не ожидая ответа db. Следовательно, почему второй вызов работает из-за того, что ваша переменная обновляется после отправки res. Попробуйте ниже

const url = "mongodb://localhost:27017/";
const mongoClient = new MongoClient(new Server(url, 27017));


async function readDB() {
    mongoClient.open(function(err, db) {
      if (err) throw err;
      var dbo = db.db("simpledb");
      const res = dbo.collection("simplecollection").find().toArray(function(err, result) {
        if (err) throw err;
        return result
      });
      mongoClient.close();
      return await res
    });
};

mongoClient.open(function(err, mongoClient) {
  var db1 = mongoClient.db("mydb");

  mongoClient.close();
});

Кроме того, не рекомендуется создавать соединение для каждой задачи.

Я бы предложил создать отдельную функцию для подключения при запуске сервера, а затем просто использовать client.open (), когда вы хотите выполнять задачи БД

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