3

我正在尝试在 lichess.org 上使用此端点的数据。

这是一个使用该数据流的 React 组件的最小工作示例。我正在使用一个名为can-ndjson-stream的库。

import ndjsonStream from "can-ndjson-stream"
import { useEffect } from "react"

function App() {
  useEffect(() => {
    fetch("https://lichess.org/api/tv/feed")
      .then(res => ndjsonStream(res.body))
      .then(stream => {
        const streamReader = stream.getReader()
        streamReader.read().then(async res => {
          while (!res || !res.done) {
            res = await streamReader.read()
            console.log(res.value)
          }
        })
      })
      .catch(console.error)
  }, [])
  return <>Lorem Ipsum</>
}

export default App

但是,如果我尝试编写相同的代码并像这样在 Node 中运行它:

import ndjsonStream from "can-ndjson-stream"
import fetch from "node-fetch"

fetch("https://lichess.org/api/tv/feed")
  .then(res => ndjsonStream(res.body))
  .then(stream => {
    const streamReader = stream.getReader()
    streamReader.read().then(async res => {
      while (!res || !res.done) {
        res = await streamReader.read()
        console.log(res.value)
      }
    })
  })
  .catch(console.error)

我收到此错误:

ReferenceError:ReadableStream 未在 ndjsonStream 中定义

因此,从 fetch 中获取的似乎res是 null 或未定义,但获取其他 API 工作正常。

我还尝试使用axios而不是node-fetch,如下所示:

import ndjsonStream from "can-ndjson-stream"
import axios from "axios"

axios
  .get("https://lichess.org/api/tv/feed")
  .then(res => ndjsonStream(res.data))
  .then(stream => {
    const streamReader = stream.getReader()
    streamReader.read().then(async res => {
      while (!res || !res.done) {
        res = await streamReader.read()
        console.log(res.value)
      }
    })
  })
  .catch(console.error)

但它只是挂起并且没有显示输出。感谢任何可以对此有所了解或提供在 Node.js 中运行它的任何替代方法的人。

4

1 回答 1

2

多亏了 tromgy 的评论,我才能做出一些有用的东西。我使用库hyperquest来帮助处理流的请求和管道。我还使用了ndjson库。

这是一些工作代码:

hyperquest("https://lichess.org/api/tv/feed")
    .pipe(ndjson.parse())
    .on("data", console.log)

请注意,您可以使用 的第二个参数在对象到达时对其进行操作on(),如下所示。

...
.on("data", (obj) => {
    foo(obj)
})
于 2021-10-09T23:22:47.370 回答