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