@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
.
@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!