Не уверен, почему узел постоянно работает - PullRequest
0 голосов
/ 04 февраля 2020

Я не могу понять, почему это приложение продолжает работать. Я пытался использовать пакет Why-is-node-running , но я не совсем уверен, как правильно прочитать вывод. Вот первый вывод:

There are 30 handle(s) keeping the process running
    # TCPWRAP
    /node_modules/mongodb/lib/core/connection/connect.js:269 - socket = tls.connect(parseSslOptions(family, options));
    /node_modules/mongodb/lib/core/connection/connect.js:29  - makeConnection(family, options, cancellationToken, (err, socket) => {
    /node_modules/mongodb/lib/core/sdam/monitor.js:182       - connect(monitor.connectOptions, monitor[kCancellationToken], (err, conn) => {
    /node_modules/mongodb/lib/core/sdam/monitor.js:206       - checkServer(monitor, e0 => {
    /node_modules/mongodb/lib/core/sdam/monitor.js:92        - monitorServer(this); 

Я предполагаю, что это как-то связано с некорректным закрытием MongoDB. Хотя, когда я удалил все остальные функции между открытием клиента и его закрытием, он прекрасно открывался и закрывался.

Добавление process.exit() в конце корректно закрывает программу, но я бы хотел выяснить, почему она не закрывается.

Резюме приложения заключается в том, что оно получает данные из MongoDB, очистка, а затем запись в Firestore - так много асин c действий происходит, но я не видел, чтобы связанные с Firestore вещи появлялись в журналах «почему работает узел».

const GrabStuffFromDBToCalculate = require("./helpers/GrabStuffFromDBToCalculate");
const SendToFirestore = require("./helpers/SendToFirestore");
const log = require("why-is-node-running");
const { MongoClient } = require("mongodb");
require("dotenv").config();

const main = async () => {
  try {
    const client = await MongoClient.connect(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true
    });
    const collection = await client.db("test").collection("testcollection");
    const trip_object = await GrabStuffFromDBToCalculate(collection);
    SendToFirestore(trip_object);
    client.close();
    log(); // "There are 30 handle(s) keeping the process running including node_modules/mongodb/lib/core/connection/connect.js:269 - socket = tls.connect(parseSslOptions(family, options));"
    // process.exit() // this closes everything but I'd rather not have to use this
  } catch (err) {
    console.log(err);
    client.close();
  }
};

const runAsync = async () => {
  await main(); // this exists because I'm usually running multiple main() functions
};

runAsync();

Код SendToFirestore:

const firebase = require("firebase");
const firebaseConfig = require("../config");

module.exports = SendToFirestore = trip_object => {
  if (!firebase.apps.length) {
    firebase.initializeApp(firebaseConfig);
  }
  const db = firebase.firestore();
  db.doc(`hello/${object._id}`).set({
    objectid:object._id
  });
};

GrabStuffFromDBToCalculate code (упрощенный способ):

module.exports = GrabStuffFromDBToCalculate = async collection => {
  const cursor = await collection
    .aggregate([

        // does a bunch of stuff here

    ])
    .toArray();
  const newObj = cursor[0];
  return newObj;
};

1 Ответ

0 голосов
/ 04 февраля 2020

Превращение моего комментария в ответ, поскольку оно привело к отсутствию фрагмента.

Узел не закрывается, потому что у вас открытое соединение с Firestore. Вам нужно будет вызвать terminate , чтобы позволить SDK завершить работу, и освободить ресурсы:

db.terminate();

, что важно для разрешения nodejs на автоматическое отключение.


Кроме того, я не уверен, что вы поняли, что я предлагал вам использовать await как в

await client.close()

перед вызовом log(), так что вы уверены, что клиентское соединение было закрыто, прежде чем делать запись. client.close() - это асинхронный метод, поэтому ваш исходный код будет log() до завершения этого закрытия.

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