JavaScript Почему некоторый код выполняется в неожиданном порядке?

Проблема с порядком выполнения кода в Node.js

Привет всем! У меня есть проблема с пониманием того, как работает JavaScript в Node.js. Раньше я писал в основном на Java, поэтому асинхронность для меня новая.

Я создаю проект для импорта текстовых данных в MongoDB через Node.js. Код работает нормально, но меня смущает порядок выполнения операций.

Вот что я вижу в консоли:

  1. файл прочитан полностью
  2. закрываю базу данных
  3. запись добавлена (повторяется много раз)

Вот мой код:

var fileSystem = require('fs'),
    lineReader = require('readline'),
    inputStream = fileSystem.createReadStream(settings.fileName),
    outputStream = new (require('stream'))(),
    reader = lineReader.createInterface(inputStream, outputStream);

reader.on('line', function (currentLine) {
    var parts = currentLine.split(" ");
    
    userName = "@" + parts[0];
    messageText = "'" + parts[1] + "'";
    authorName = settings.authorName;
    createdDate = new Date().toISOString();
    
    messageData = { 
        username: userName, 
        message: messageText, 
        author: authorName, 
        created: createdDate
    };
    
    database.collection("messages").insertOne(messageData, function(error, result) {
        if (error) throw error;
        console.log("запись добавлена");
    });
});

reader.on('close', function (currentLine) {
    console.log('файл прочитан полностью');
    console.log('закрываю базу данных')
    database.close();
});

Почему я сначала вижу сообщения о закрытии файла и базы, а потом все сообщения о добавлении записей? Это из-за задержки при работе с базой данных? И как вообще записи добавляются, если база уже закрыта?

Буду благодарен за объяснение!

Всё дело в event loop! Файл закончился, событие ‘close’ сразу выполняется, а коллбэки от insertOne ещё висят в очереди. База данных не закрывается моментально - ждёт завершения всех операций. Порядок такой: файл → close → коллбэки вставок. А если файл огромный? Не боишься переполнения очереди операций?

да, классика node.js! insertOne асинхронная - не блокирует код. когда читаешь файл, все вставки просто запускаются и идут в очередь, но не ждут завершения. поэтому close срабатывает раньше всех вставок. база не закрывается сразу - у неё внутренняя очередь операций, которую она дожидается. лучше так не делать, можешь потерять данные при неожиданном завершении.

Проблема в том, что insertOne не ждёт завершения - сразу возвращает управление. Когда срабатывает reader.on(‘close’), файл уже прочитан, но вставки в базу всё ещё висят в pending. MongoDB драйвер достаточно умный - он не закроет соединение, пока есть активные операции, так что записи проходят. Но это плохая практика. Лучше считать pending операции и закрывать базу только после их завершения.