Чтение нескольких файлов и запись в один файл Node.JS - PullRequest
0 голосов
/ 08 января 2020

В настоящее время я пытаюсь создать конвейер данных, используя Node.js Конечно, это не лучший способ сделать это, но я хочу попробовать реализовать его в любом случае, прежде чем вносить улучшения в него.

Это ситуация

У меня есть несколько сжатых GZIP CSV-файлов на AWS S3. Я получаю эти "объекты", используя aws sdk

, как показано ниже, и превращаю их в readStream

const unzip = createGunzip()
const input = s3.getObject(parameterWithBucketandKey)
.createReadStream()
.pipe(unzip)

и, используя поток выше, создаю интерфейс readline

const targetFile = createWriteSTream('path to target file');
const rl = createInterface({
input: input
})
let first = true;
rl.on('line', (line) => {
   if(first) {
     first = false;
     return;
  }
   targetFile.write(line);
   await getstats_and_fetch_filesize();
   if(filesize > allowed_size){
      changed_file_name = change_the_name_of_file()
      compress(change_file_name)
   }
});

и это обернуто как обещание

, и у меня есть массив имен файлов, которые нужно извлечь из AWS S3, и сопоставьте этот массив имен файлов, как это

const arrayOfFileNames = [name1, name2, name3 ... and 5000 more]
const arrayOfPromiseFileProcesses= arrayOfFileNames.map((filename) => return promiseFileProcess(filename))

await Promise.all(arrayOfPromiseFileProcesses);


// the result should be multiple gzip files that are compressed again.

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

Моя проблема в том, что он хорошо пишет в файл, но когда я изменяю имя файла, он это не создает потом. Я потерялся в этом синхронном и асинхронном мире ...

Пожалуйста, дайте мне подсказку / ссылку для чтения. Спасибо.

1 Ответ

0 голосов
/ 09 января 2020

обработчик события строки должен быть асин c функцией, так как он вызывает await

rl.on('line', async(line) => {
  if(first) {
    first = false;
    return;
 }
 targetFile.write(line);
 await getstats_and_fetch_filesize();
 if(filesize > allowed_size){
  changed_file_name = change_the_name_of_file()
  compress(change_file_name)
 }
});
...