1-3 'SyntaxError: неожиданный конец ввода JSON' ошибки, возникающие в минуту при потоковой передаче твитов в Node

Используя express и Node.js, я использую API потоковой передачи twitter и пакет Needle npm для доступа к API и извлечения твитов, связанных с ключевыми словами. Потоковая передача работает, и я успешно получаю твиты, используя следующий (упрощенный) код:

      const needle = require('needle');
const TOKEN = // My Token 
const streamURL = 'https://api.twitter.com/2/tweets/search/stream';

function streamTweets() {

    const stream = needle.get(streamURL, {
        headers: {
            Authorization: `Bearer ${TOKEN}`
        }
    });

    stream.on('data', (data) => {
        try {
            const json = JSON.parse(data); // This line appears to be causing my error
            const text = json.data.text;
        } catch (error) {
             console.log("error");
        }
    });
}

Однако независимо от того, какой поисковый запрос я использую (и последующий большой или малый объем поступающих твитов), блок catch будет последовательно регистрировать 1-3 ошибки в минуту, которые выглядят следующим образом:

      SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at PassThrough.<anonymous> (C:\Users\danie\OneDrive\Documents\Personal-Projects\twitter-program\server.js:56:31)
    at PassThrough.emit (events.js:315:20)
    at addChunk (internal/streams/readable.js:309:12)
    at readableAddChunk (internal/streams/readable.js:284:9)
    at PassThrough.Readable.push (internal/streams/readable.js:223:10)
    at PassThrough.Transform.push (internal/streams/transform.js:166:32)
    at PassThrough.afterTransform (internal/streams/transform.js:101:10)
    at PassThrough._transform (internal/streams/passthrough.js:46:3)
    at PassThrough.Transform._read (internal/streams/transform.js:205:10).

Я видел предыдущий совет, в котором говорится, что данные можно запускать несколькими фрагментами и помещать фрагменты в массив, то есть что-то вроде следующего:

      let chunks = [];
        stream.on('data', (dataChunk) => {
chunks.push(dataChunk);
        }).on('end',() => {
// combine chunks to create JSON object
})

Но это тоже не сработало (возможно, это была моя реализация, но я так не думаю), и теперь мне интересно, возможно, это ошибка API твиттера, потому что большинство объектов твита проходят правильно. Я должен отметить, что приведенная выше функция streamTweets() вызывается из асинхронной функции, и мне также интересно, связано ли это с этим.

Кто-нибудь еще сталкивался с этой ошибкой? Или кто-нибудь знает, как я могу это исправить? В идеале я бы хотел, чтобы 100% твитов транслировались правильно.

Заранее спасибо!

1 ответ

Для будущих читателей: эта ошибка вызвана пульсирующим сообщением Twitter, которое отправляется каждые 20 секунд. Согласно документации:

Конечная точка обеспечивает 20-секундное подтверждение работоспособности (это будет выглядеть как символ новой строки).

Добавление защиты от синтаксического анализа пустой строки предотвратит ошибку синтаксического анализа JSON.

      if (data === "")
  return

Пустая строка является недопустимым JSON, поэтому выдается ошибка.


Теперь, признав, что сердцебиение существует, может оказаться полезным добавитьread_timeout = 20 * 1000в запросе иглы, чтобы избежать зависшей программы без данных, будь то из-за сбоя в локальной сети или отсутствия DNS и т. д.

Другие вопросы по тегам