Как создать поток stream посредник в node.js?

Пользователь

от chloe.keebler , в категории: JavaScript , 2 года назад

Как создать поток stream посредник в node.js?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от eryn.rodriguez , 2 года назад

@chloe.keebler 

В Node.js существует несколько способов создания потоков-посредников (stream transform). Один из самых простых способов - создать новый класс, который расширяет класс Transform из модуля stream. Этот класс может переопределять метод _transform, который вызывается для каждого фрагмента данных, проходящего через поток.


Ниже приведен пример простого потока-посредника, который принимает данные в виде строки и преобразует их в верхний регистр:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
const { Transform } = require('stream');

class UpperCaseTransform extends Transform {
  _transform(chunk, encoding, callback) {
    const uppercased = chunk.toString().toUpperCase();
    this.push(uppercased);
    callback();
  }
}

// Пример использования
const uppercaser = new UpperCaseTransform();
process.stdin.pipe(uppercaser).pipe(process.stdout);


В этом примере создается новый класс UpperCaseTransform, который наследуется от Transform. При каждом вызове _transform метода, поток преобразует данные в верхний регистр с помощью метода toUpperCase и отправляет их дальше в поток с помощью метода this.push. Затем вызывается колбэк callback, чтобы сообщить потоку, что обработка фрагмента данных завершена.


Затем создается экземпляр потока UpperCaseTransform и используется для преобразования данных из process.stdin. Результат преобразования отправляется в process.stdout.

Пользователь

от laney_johnson , год назад

@chloe.keebler 

Вот пример более сложного потока-посредника, который принимает данные в виде JSON-строки, добавляет к ним новое свойство и преобразует их обратно в JSON-строку:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const { Transform } = require('stream');

class AddPropertyTransform extends Transform {
  constructor(propName) {
    super({ readableObjectMode: true, writableObjectMode: true });
    this.propName = propName;
  }

  _transform(obj, encoding, callback) {
    obj[this.propName] = 'exampleValue'; // добавляем новое свойство
    this.push(obj); // отправляем измененный объект дальше в поток
    callback();
  }
}

// Пример использования
const addPropertyTransformer = new AddPropertyTransform('newProperty');
const input = [
  { name: 'John', age: 30 },
  { name: 'Jane', age: 25 },
];

input.forEach((obj) => {
  addPropertyTransformer.write(obj); // отправляем исходные объекты в поток
});

addPropertyTransformer.end(); // завершаем поток после отправки всех данных

addPropertyTransformer.on('data', (transformedObj) => {
  console.log(transformedObj); // выводим измененные объекты
});


В этом примере создается новый класс AddPropertyTransform, который также расширяет класс Transform и принимает название свойства, которое будет добавляться к каждому объекту. При вызове _transform метода, он добавляет новое свойство к объекту и отправляет его дальше в поток. В примере создается экземпляр потока AddPropertyTransform, в цикле отправляются исходные объекты в поток, а затем используется событие 'data', чтобы получить преобразованные объекты и вывести их в консоль.


Надеюсь, это поможет вам создать поток-посредник в Node.js!