1-3 在 Node 中流式传输推文时每分钟发生"语法错误:JSON 输入意外结束"错误



使用express和Node.js,我使用twitter流API和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:UsersdanieOneDriveDocumentsPersonal-Projectstwitter-programserver.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
})

但这也不起作用(可能是我的实现,但我不这么认为(,现在我想知道这是否是twitter API的错误,因为大多数tweet对象都能正确通过。我应该注意到上面的streamTweets((函数是从一个异步函数调用的,我还想知道这是否与它有关

是否有其他人遇到此错误?或者有人知道我该怎么解决吗?理想情况下,我希望100%的推文都能正确流式传输。

提前感谢!

对于未来的读者来说,这个错误是由每20秒发送一次的Twitter心跳消息触发的。根据文件:

端点提供20秒的保持活动心跳(看起来像一个换行符(。

添加防止解析空字符串的保护将防止JSON解析错误。

if (data === "")
return

空字符串是无效的JSON,因此会发出错误。


现在,确认心跳存在,在指针请求中添加read_timeout = 20 * 1000可能是有益的,以避免由于本地网络中断或DNS丢失等原因而导致的无数据程序停滞。

最新更新