仅从 NodeJS.ReadableStream 获取第一项

问题描述 投票:0回答:1

我想知道是否可以从获取响应正文中的可读流中仅获取第一项而不进行迭代。

数据以原始字符串形式出现,看起来像这样:

...
2023-11-28T00:00:00.0000000Z { "data": { ..., "p": "36966.01000000", ... } }]
...

我不能只用

JSON.parse()
来解析它,所以我找到了一种像这样读取流的方法:

import split from 'split2'
import fetch from 'node-fetch'

const response = await fetch(<url>, <options>)
const lines = response.body.pipe(split())
for await (const line of lines) {
    let value = parseFloat(JSON.parse(line.split(' ')[1]).data.p)
    break
}

此方法涉及在

for...of
循环中传递管道的线路,并在第一次迭代后将其断开。

有更高效/优雅的方法吗?

javascript node.js typescript fetch
1个回答
1
投票

您的代码对于处理可读流并提取第一项而无需迭代整个流已经相当合理。 您可能想要处理错误并确保在处理所需数据后正确关闭流。

import split from 'split2';
import fetch from 'node-fetch';

try {
  const response = await fetch(<url>, <options>);

  if (!response.ok) {
    throw new Error(`HTTP error! Status: ${response.status}`);
  }

  const lines = response.body.pipe(split());
  for await (const line of lines) {
    try {
      const value = parseFloat(JSON.parse(line.split(' ')[1]).data.p);
      // Do something with the value
      console.log(value);
      break; // Stop after the first line
    } catch (error) {
      console.error('Error parsing line:', error.message);
    }
  }
} catch (error) {
  console.error('Fetch error:', error.message);
} finally {
  if (response && response.body) {
    response.body.destroy(); // Close the stream
  }
}

这有助于防止潜在的资源泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.