Прочитать CSV-файл asyn c - NodeJS - PullRequest
1 голос
/ 03 мая 2020

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

Вот мой код.

var csv = require("fast-csv");
function findTeacher(req, res) {
    csv.parseFile(req.body.file)
    .on("data", async function(data) {
        var teacher = await Teachers.find({name: data});
        console.log(teacher);
    })
    .on("end", function() {
        console.log("end");
    });
}

Моя проблема в том, почему «конец» печатается первым, даже если я использую asyn c и жду.

Есть ли способ напечатать учителя перед «концом»?

1 Ответ

2 голосов
/ 03 мая 2020

Я не знаю, какую библиотеку синтаксического анализа csv вы используете, зная, что это поможет, но эти обработчики событий отделены от фактического синтаксического анализа csv. Таким образом, событие data отправляется, и вызывается ваша функция on data, но это требует времени (это асинхронная c функция, записывающая в базу данных). Проблема для вас заключается в том, что запуск функции on on data не блокирует синтаксический анализатор csv, который продолжает работу и выдает свое событие «end», пока функция on on data все еще работает. Таким образом, вы регистрируете конец, когда разбор csv завершен, а не когда ваш обработчик событий завершен.

Самый простой способ справиться с этим - прочитать все строки в очередь, обработать их, затем завершить запись .

var csv = require("fast-csv");
function findTeacher(req, res) {
    var lines = [];
    csv.parseFile(req.body.file)
    .on("data", function(data) {
       lines.push(data);
    })
    .on("end", function() {
       lines.forEach(function(data) {
         var teacher = await Teachers.find({name: data});
         console.log(teacher);
       });
        console.log("end");
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...