Как использовать StreamM2 ObjectMode? - программирование
Подтвердить что ты не робот

Как использовать StreamM2 ObjectMode?

В Node v10.11, я пытаюсь вытолкнуть объекты вниз по каналу, но всегда получаю ошибку.

events.js:72
    throw er; // Unhandled 'error' event
          ^
TypeError: Invalid non-string/buffer chunk
    at validChunk (_stream_writable.js:150:14)
    at WriteStream.Writable.write (_stream_writable.js:179:12)

Я могу сделать

this.push(chunk)

чтобы напрямую передавать данные, но я не могу сделать

var result = {'the web content is': chunk}
this.push(result)

runnable example в 30 LOC:

var stream = require('stream');

var MsgExtractStream = function() {
  stream.Transform.call(this,{objectMode: true});
}

MsgExtractStream.prototype = Object.create(
  stream.Transform.prototype, {constructor: {value: MsgExtractStream}} )

MsgExtractStream.prototype._transform = function(chunk, encoding, callback) {
  var result = {'the website is': chunk};
  this.push(result);
}

MsgExtractStream.prototype.write = function () {
  this._transform.apply(this, arguments);
};

MsgExtractStream.prototype.end = function () {
  this._transform.apply(this, arguments);
  this.emit("end");
};

var fs = require("fs"),
  inPage = fs.createReadStream("inPage.html"),
  outPage = fs.createWriteStream("outPage.html"),
  msgPage = new MsgExtractStream();

inPage.
pipe(msgPage).
pipe(outPage);
4b9b3361

Ответ 1

Все, что вы делаете, является правильным, за исключением последнего утверждения. Вы передаете результаты потока MsgExtractStream a Transform с objectMode на простой поток.

Когда вы трубу, вы читаете материал из msgPage, вы получаете объекты, а затем записываете их в outPage. Но outPage не имеет objectMode on, поэтому ему нужны строки/буфер и выдает ошибку при записи на нее.

Попробуйте сделать только одну из труб, она будет работать.

Изменить

Это был мой метод для отладки ошибки, один из которых не вызывает ошибки. Сначала мы проверим поток данных, который выглядит примерно так:

string stream -> object stream -> string stream
             string          object

Часть, которую вы получаете в MsgExtractStream, представляет собой строку из inPage. Было бы хорошо, если бы какой-либо объект не просто был строкой. В преобразовании вы записываете фрагмент, завернутый в объект для вывода. Вы получаете строку и записываете объект.

Теперь у вас есть два варианта. Чтобы решить проблему, MsgExtractStream должен возвращать строку, например, когда вы делаете this.push(chunk), чтобы работала следующая труба.

Или, если вам нужен поток объектов, вы получаете от MsgExtractStream. Вам понадобится еще одна такая трубка:

string stream -> object stream -> object stream -> string stream
            string           object           string

Первый поток объектов создает объект из строки, второй создает строку из объекта. Вам придется обрабатывать тип объектов вдоль цепочки, чтобы он работал.