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 и т. д.