以下のコードを使用して SSE ストリームに接続しています。
const getNonTradingEventsUsingHttp = async (onData: (data: string) => void): Promise<any | void> => {
return new Promise((resolve, reject) => {
https.get(new URL(`https://some.com/events`), { headers: { Authorization: this.authHeader(apiKey, apiSecret) } }, res => {
res.on('data', data => processSSEDataframe(data.toString()).forEach(onData))
res.on('end', resolve)
res.on('error', (err: any) => reject(err))
})
})
}
processSSEDataframe = (dataframe: string): string[] => {
/**
* Takes in a raw dataframe from a Server Sent Events stream,
* parses the message and returns an array of string objects
* representing JSON data that can be used upstream.
*
* We return an array because the dataframe can include no
* data objects (e.g. the welcome message), or it cane include
* multiple objects (separated by \n\n)
*/
const messages = dataframe.split('\n\n')
const data: string[] = []
messages.forEach(msg => {
if (msg.startsWith(': welcome')) {
console.log('Connected to events stream')
return // skip
}
const dataFramePrefix = 'data:'
if (msg.startsWith(dataFramePrefix)) {
const contents = msg.slice(dataFramePrefix.length).trim()
data.push(contents)
return // done
}
})
return data
}
今、それを使用するのは簡単です。私はそれを次のように呼んでいます:
const onData = (data: string) => {
console.log(JSON.parse(data))
}
await getNonTradingEventsUsingHttp(onData);
問題
スクリプトを実行すると、JSON パーサー エラーが発生します。
SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
文字列を調べると、data
切り捨てられていることがわかります。
{...,"net_amount":31467.62,"per_share_amount":n // <-- the rest is missing!
このコマンドを CURL で実行してみましたが、この問題はありません。
また、デバッグ ブレークポイントをres.on('end')
とres.on('error')
に追加して、ストリームが突然終了する原因になっているかどうかを確認しましたが、どちらもトリガーされませんでした。
私のNodeプログラムで出力が切り捨てられる理由を理解するのを手伝ってもらえますか?