Поток преобразования Node.js зависает до конца потока чтения - PullRequest
0 голосов
/ 23 сентября 2018

В настоящее время я реализую конвейер с потоками для файлов CSV для записи своих строк в БД с определенной моделью.Я начал с записи всего на стандартный вывод.Это быстро привело к неожиданному поведению, когда я подключил свой собственный поток карт продукта (Transform).

Сначала я начал использовать только поток чтения fs, передал его в преобразователь csv (на основе пакета npm csv-упорядочить) и написал в process.stdout.Все текло как обычно.

Но потом я подключил свой собственный трансформатор, и он начал работать странно.Потому что, как только я применю любую операцию (JSON.parse, typeof chunk) к чанку в преобразовании, данные не будут перетекать непосредственно в стандартный вывод, а, как кажется, только после завершения чтения.

Кто-нибудь знает, почему это происходит?

Мой конвейер:

const filePath = path.join(__dirname, 'file1.csv');

//From NPM module: csv-streamify
const csvTransformer = csv({objectMode: false, columns: true});
const mapper = new CsvMapper();
const productMapStream = ProductMapStream.create(mapper);
const writeStream = ProductWriteStream.create(this.connectionPool);

  fs.createReadStream(filePath)
    .pipe(csvTransformer)
    .pipe(csvProductMapStream)
    .pipe(process.stdout)
    .on('finish', () => resolve('Ok'))

Мой поток пользовательских преобразований:

export class ProductMapStream {

  static create(mapper: ProductMappable) {
    return new Transform({
      transform(chunk: any, enc, callback) {
        try {
          const chunkAsString = chunk.toString('utf8');
          // This already prevents continuous flowing
          const newString = '' + (typeof chunkAsString);
          this.push(newString);
          callback(null);
        } catch (e) {
          callback(e);
        }
      }
    }).once('error', console.log)
  }
}

РЕДАКТИРОВАНИЕ:

После некоторых экспериментов, основанных на комментариях @PatrickDillon, я обнаружил, что эта проблема возникает только тогда, когда она запускается внутри контейнера Docker.Я пробовал разные версии узлов на основе изображений узлов Docker.Я начал с узла: 8.12.0-alpine, и я также попробовал узел: 10.11.0-jessie, но, к сожалению, без различий в поведении.Кто-нибудь знает о специальном поведении при использовании Docker с fs или потоками или чем-то, что может показаться связанным?

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