TL; DR. В вашем коде есть небольшая ошибка, которая может стать причиной вашей проблемы - когда вы используете await, для его запуска вам нужно поставить async
до function
на обработчике data
- он может работать с небольшими файлами, но , пожалуйста, прочтите это не правильное решение - я добавил один из подходящих способов ниже .
ES6 async / await - это языковая конструкция, которая позволяет await
разрешить Обещание и продолжить выполнение кода в функции async
.В вашем коде у вас есть объявление async function
, однако вы добавили await
в не асинхронную функцию.Для пояснения - ключевое слово await
будет разрешено только в том случае, если ближайший function() {
равен async
- в вашем случае это не так.
На самом деле я не думаю, что ваш код даже скомпилируется, и после некоторых изменений вы попадете прямо к проблеме, упомянутой в этом вопросе - это потому, что вы пытаетесь запуститьасинхронная операция на синхронном обработчике события в узле.Эта асинхронная вставка в базу данных будет запущена, но событие end
сработает до завершения операций .
Чтобы сделать это правильно - вы можете использовать поток преобразования иливообще отказаться от потоковой передачи и просто использовать массив из CSV (для этого более чем достаточно хороших модулей).Однако я являюсь автором scramjet framework, и я также думаю, что это должно просто работать, как вы написали, или, может быть, даже проще.
Вот код, который будет делать то, что вы хотите:
const {StringStream} = require('scramjet');
Controller.uploadCsv = async(data) =>
fs.createReadStream(data.path)
.pipe(new StringStream('utf-8'))
.CSVParse({
delimiter: '\t',
newline: '\n',
escapeChar: '"',
quoteChar: '"'
})
.map(data => ({
name: data.name,
address: data.address,
phoneNo: data.phoneNumber,
email: data.email,
created_at: new Date(),
updated_at: new Date()
}))
.each(async entry => await models.table.create(entry))
.each(result => log(result)) // if it's worth logging
.run();
Scramjet просто использует потоки (все классы расширяют встроенные потоки node.js) внизу, но предоставляет интерфейс, похожий на синхронныйте, что в массиве и т. д. Вы можете запускать асинхронные операции, и он возвращает Promise из операции run
.