Ошибка просмотра переданных по каналу данных внутри канала

#node.js #error-handling #pipe

#node.js #обработка ошибок #канал

Вопрос:

В следующем блоке кода, как я могу зарегистрировать конвейерные данные, вызывающие сбой JSONStream.parse?

 data.pipe(JSONStream.parse('*'))
.on('error', () => {
    // here I'd like to see the data causing JOSONStream.parse to blow up
    reject("Error parsing the json!");
})
.pipe(objectStream);
  

Я спрашиваю, потому что в настоящее время, когда он взрывается, я получаю такое сообщение об ошибке, но нет контекста для того, что такое недопустимый символ UTF-8:

 Error: Invalid JSON (Invalid UTF-8 character at position 2397 in state STRING1)
        at Parser.proto.write (/var/www/data-site/pop-service/node_modules/JSONStream/node_modules/jsonparse/jsonparse.js:120:31)
        at Stream.<anonymous> (/var/www/data-site/pop-service/node_modules/JSONStream/index.js:23:12)
        at Stream.stream.write (/var/www/data-site/pop-service/node_modules/JSONStream/node_modules/through/index.js:26:11)
        at IncomingMessage.ondata (_stream_readable.js:536:20)
        at emitOne (events.js:82:20)
        at IncomingMessage.emit (events.js:169:7)
        at readableAddChunk (_stream_readable.js:153:18)
        at IncomingMessage.Readable.push (_stream_readable.js:111:10)
        at HTTPParser.parserOnBody (_http_common.js:124:22)
        at TLSSocket.socketOnData (_http_client.js:320:20)
  

что-то вроде .on('error', (data) => {... , похоже, не работает

Решение с использованием ответа от @drinchev

     //save the last chunk so that we can log it in case of parsing error
    let lastRetrievedChunk = '';
    data.on('data', (dd: any) => {
      lastRetrievedChunk = dd.toString();
    });

    let jsonParser = JSONStream.parse('*');
    jsonParser.on('error', (err: any) => {
      reject(err.stack   ' lastchunk = '   lastRetrievedChunk);
    });
    data.pipe(jsonParser).pipe(objectStream);
  

Ответ №1:

Это действительно не работает, поскольку это процесс, управляемый событиями.

Вы можете попытаться сохранить данные в переменной и передать их в ошибку

 var someString = '*';

data.pipe(JSONStream.parse(someString))
    .on('error', () => {
       console.log( someString );
       reject("Error parsing the json!");
    })
    .pipe(objectStream);
  

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