NodeJs не создает базу данных в MongoDb?Как это решить? - PullRequest
1 голос
/ 19 сентября 2019

Следующий код - это NodeJS 8.10 внутри лямбда-функции с использованием mongodb drive.Он является частью этого учебника .

. Он должен создать базу данных testlambda2 и вернуть "inside function".Но я получаю только "outside function", а база данных не создается.Кажется, что функция не вызывается.Это был единственный способ выяснить, была ли установлена ​​связь.Что мне не хватает?

"use strict";

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

function createDb(){
    MongoClient.connect("mongodb://167.114.36.160:27017/testlambda2",
        { useNewUrlParser: true, useUnifiedTopology: true },
        function(err, db) {
            if (err) throw err;
            console.log("Database created!");
            db.close();
            return "inside function";
    });
    return "outside function";
}


module.exports.consumo_monofasico = async (event, context) => {

    var res= await createDb();

    const promise = {
        statusCode: 200,
        body: JSON.stringify(
            {
                message: 'Test mongo!',
                resultado:res
            },
            null,
            2
        ),
    };
    return promise
};

У меня нет ошибок в cloudwatch и нет журналов ошибок enter image description here

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Функция createDB никогда не вернет "inside function", потому что строка возврата return "inside function"; возвращается для callback функции function (err, db), а не createDB.Другая сторона, MongoClient.connect и return "outside function";, будут выполняться в одно и то же время, тогда createDB ничего не сделает, просто вернет строку "outside function".Ваша лямбда-функция занимает всего 50 мс: |.

Но почему MongoClient.connect - это функция callback, функция callback будет вызываться, когда задача - MongoClient.connect выполнена, в вашем коде вам все равнооб этом, вы просто возвращаете "outside function" string ???

Я вижу, вы используете ключевое слово await, я хочу, чтобы вы подождали, пока соединение с БД уже было, затем выполните следующий оператор.Как вы знаете (возможно) await действует только с Promise (многие вещи можно объяснить в Интернете).

Как решить вашу проблему, MongoClient.connect не даетЕсли у вас есть Promise версия (я так думаю), то вы должны преобразовать ее в версию функции Promise, и я думаю, что вам нужно подождать, это экземпляр DB вместо строки.Наконец, я предлагаю следующее:


"use strict";

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

function createDb() {
  return new Promise((resolve, reject) => { // return createDb a promise
    MongoClient.connect("mongodb://167.114.36.160:27017/testlambda2",
      { useNewUrlParser: true, useUnifiedTopology: true },
      function (err, db) {
        if (err) {
          return reject(err);
        };
        console.log("Database created!");
        resolve(db); // like return :)
      });
  })
}


module.exports.consumo_monofasico = async (event, context) => {
  let result = {};

  try {
    var db = await createDb(); // now you can get a response what has been "pushed" in  `resolve`
    // TODO: Do some things with db instance
    // success response
    result = {
      statusCode: 200,
      body: JSON.stringify(
        {
          message: 'Test mongo!',
          resultado: "Connected!"
        },
        null,
        2
      ),
    };
    // close db connection
    db.close();
  } catch (err) { // err is a error what has been pushed in `reject` :|
    // error response
    result = {
      statusCode: 500, // http error code
      body: JSON.stringify(
        {
          message: 'Test mongo!',
          resultado: err
        },
        null,
        2
      ),
    };
  }
  return result;
};
0 голосов
/ 19 сентября 2019

Похоже, Mongo - это обещание, однако вы не помечаете его как асинхронную функцию или не возвращаете обещание для оценки, поэтому возвращаете часть внешней функции до того, как завершите обещание Монго, и запускаете материал Монго вфон из-за того, как работает асинхронный характер JavaScript.

"use strict";

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

module.exports.consumo_monofasico = async (event, context) => {
    try {
       var db = await MongoClient.connect("mongodb://167.114.36.160:27017/testlambda2", { useNewUrlParser: true, useUnifiedTopology: true });
       console.log("Database created!");
       db.close();
    } catch (err) {
       console.log('db error');
       throw err;
    }
    const promise = {
        statusCode: 200,
        body: JSON.stringify(
            {
                message: 'Test mongo!',
                resultado:res
            },
            null,
            2
        ),
    };
    return promise
};
0 голосов
/ 19 сентября 2019

Из тестов, которые я провел, MongoDB, вероятно, ваше соединение отклонено сервером.Попробуйте изменить порт или настроить внешний доступ «вкл» (имея IP-адрес 0.0.0.0/0 в белом списке, он позволяет любому IP-адресу устанавливать соединение с вашим сервером, например) в конфигурациях сервера MongoDB.

Надеюсь, вы найдете этот ответ полезным.

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