我现在想在 node.js 平台上使用 hono.js ,现在需要实现一个文件下载需求
//几个类型导入:
import { stream } from "hono/streaming"
import { Readable, Writable } from "node:stream"
import { ReadableStream } from "node:stream/web"
// ......
const fileStream = createReadStream(filePath)
// 将文件流作为响应返回给客户端
return stream(
c,
async (stream) => {
// Write a process to be executed when aborted.
stream.onAbort(() => {
console.log('Aborted!')
})
// Write a Uint8Array.
await stream.write(
new Uint8Array([0x48, 0x65, 0x6c, 0x6c, 0x6f])
)
// Pipe a readable stream.
// 这里出现了类型不兼容
// await stream.pipe(Readable.toWeb(fileStream))
await stream.pipe(ReadableStream.from(fileStream))
},
async (err, stream) => {
// stream.writeln('An error occurred!')
console.error('An error occurred!', err)
}
)
ts 提示: 类型“import("stream/web").ReadableStream<any>”的参数不能赋给类型“ReadableStream<any>”的参数. 属性“pipeThrough”的类型不兼容。
我该如何解决,或者说如何在 nodejs 环境使用...
谢谢大家了!🙇😘
1
fov6363 9 天前
加个 any 先跑起来
|
2
fov6363 9 天前 ![]() await stream.pipe((ReadableStream as any).from(fileStream))
|
![]() |
3
Belmode OP |
4
fov6363 9 天前
@Belmode 看代码是与 hono/streaming 的 stream 类型冲突了,检查一下 hono/streaming 的 typescript 与你 package.json 中的 typescript 版本是否一致
|
![]() |
7
Aolose 9 天前
说 any 的别误导人啊,不兼容就是不兼容
web 的 stream 和 node 的 stream 接口都不一样 你 as any 还要什么 ts ? 我没有看过 hono 的 stream 不过从这个 pipe 看应该是实现的 node stream 的设计 你转 httpresponse body 的 stream 可以使构建一个 TransformStream 或者 readablestream |
![]() |
8
jiangzhexin 9 天前
hono 的 ReadableStream 就是 Web Standards ,我一般建议是尽量避免使用 node 私有的 API ,毕竟像 hono 这种框架主要卖点就是 Web Standards
特别是 Readable.toWeb() 的结果也是 node 内部的 ReadableStream 类型 你可以想办法把 fileStream 转化为标准的 ReadableStream ,或者创建这个 fileStream 就避免创建出 node 私有的 ReadableStream |
![]() |
9
Aolose 9 天前
|