无法在 Node 中使用 ndjson 流,但类似的代码在 React 中有效
Unable to consume ndjson stream in Node, but similar code works in React
我正在尝试使用来自 this endpoint on 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 is not defined
at ndjsonStream
因此,从提取中获取的 res
似乎为 null 或未定义,但提取其他 API 工作正常。
我也试过这样使用 axios instead of 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.
多亏了 tromgy 的评论,我才能够做出一些有用的东西。我和图书馆一起去了hyperquest to help handle the request and piping of the stream. I also used the ndjson图书馆
这是一些工作代码:
hyperquest("https://lichess.org/api/tv/feed")
.pipe(ndjson.parse())
.on("data", console.log)
请注意,您可以在对象到达时使用 on()
的第二个参数对其进行操作,如下所示。
...
.on("data", (obj) => {
foo(obj)
})
我正在尝试使用来自 this endpoint on 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 is not defined at ndjsonStream
因此,从提取中获取的 res
似乎为 null 或未定义,但提取其他 API 工作正常。
我也试过这样使用 axios instead of 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.
多亏了 tromgy 的评论,我才能够做出一些有用的东西。我和图书馆一起去了hyperquest to help handle the request and piping of the stream. I also used the ndjson图书馆
这是一些工作代码:
hyperquest("https://lichess.org/api/tv/feed")
.pipe(ndjson.parse())
.on("data", console.log)
请注意,您可以在对象到达时使用 on()
的第二个参数对其进行操作,如下所示。
...
.on("data", (obj) => {
foo(obj)
})