Подключение клиента MongoDB с использованием async / await приводит к зависанию функции - PullRequest
0 голосов
/ 26 апреля 2020

Подключение клиента MongoDB, кажется, работает, но функция просто зависает.

app. js

async function test() {
  console.log('Hello world');
  await new Promise((resolve) => {
    setTimeout(resolve, 50);
  });
  console.log('Bye world');
}
test();

Когда я запускаю с помощью приложения узла. js на cmd, я получаю логи и оболочка выходят как положено. Однако, когда я запускаю этот код ->

async function test() {
  console.log('Hello world');
  await MongoClient.connect(MONGODB_URI);
  console.log('Bye world');
}
test();

, и я снова запускаюсь, используя приложение узла. js. На этот раз я также получаю оба журнала, но процесс никогда не завершается. Что здесь происходит? Я что-то упускаю очень очевидное?

1 Ответ

0 голосов
/ 26 апреля 2020

Я выяснил, что здесь происходит.

const client = await MongoClient.connect(URI);

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

const client = await MongoClient.connect(URI);
// Execute some queries
await client.close();

Хотя это может быть просто ошибкой, если я неправильно прочитал документацию MongoDB, я поделюсь последствиями этой ошибки, с которой я столкнулся.

У меня был AWS лямбда-код функции, как показано ниже:

module.exports.handler = async (event) => {
  const client = await MongoClient.connect(URI);

  // Do something with the client but forgets to close

  const response = {
    statusCode: 200,
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Credentials': true,
    },
    body: JSON.stringify({ foo: 'bar' }),
  };

  console.log(response);
  return response;
};

Я получаю журнал распечатки ответа, но функция отключится и не вернет ответ.

Я выдернул несколько волос, так как я впервые работал с лямбдами и MongoDB, так что помните, ребята, закройте ваше соединение после того, как с ними покончено.

Надеюсь, это кому-нибудь поможет.

...