请教大家一个在 hono.js 中使用 ts 的类型兼容性问题

2025 年 2 月 11 日
 Belmode

我现在想在 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 环境使用...

谢谢大家了!🙇‍😘

2832 次点击
所在节点    Node.js
10 条回复
fov6363
2025 年 2 月 11 日
加个 any 先跑起来
fov6363
2025 年 2 月 11 日
await stream.pipe((ReadableStream as any).from(fileStream))
Belmode
2025 年 2 月 11 日
@fov6363 #2 多谢了,这样做确实可以。

但我心中还是有疑问,作为 ts 菜鸟。我是哪里配置的有问题呢,还是说 WEB API 和 Nodejs 的 API 不兼容导致的。
fov6363
2025 年 2 月 11 日
@Belmode 看代码是与 hono/streaming 的 stream 类型冲突了,检查一下 hono/streaming 的 typescript 与你 package.json 中的 typescript 版本是否一致
Belmode
2025 年 2 月 11 日
@fov6363 #4 typescript 更新成一样的了,还是不行。这段流的类型都是指向了 nodejs 内部的类型。
fov6363
2025 年 2 月 11 日
@Belmode 看起来 web 与 node 的类型不兼容,如果功能没问题的话,可以先用 any
Aolose
2025 年 2 月 11 日
说 any 的别误导人啊,不兼容就是不兼容
web 的 stream 和 node 的 stream 接口都不一样 你 as any 还要什么 ts ?
我没有看过 hono 的 stream 不过从这个 pipe 看应该是实现的 node stream 的设计
你转 httpresponse body 的 stream 可以使构建一个 TransformStream 或者 readablestream
jiangzhexin
2025 年 2 月 11 日
hono 的 ReadableStream 就是 Web Standards ,我一般建议是尽量避免使用 node 私有的 API ,毕竟像 hono 这种框架主要卖点就是 Web Standards

特别是 Readable.toWeb() 的结果也是 node 内部的 ReadableStream 类型

你可以想办法把 fileStream 转化为标准的 ReadableStream ,或者创建这个 fileStream 就避免创建出 node 私有的 ReadableStream
Aolose
2025 年 2 月 11 日
看了下 hono 的 stream 设计 这块和 web 的 stream 没什么关系
stream 方法已经做了包装
回调函数中的 stream 你直接把流往里头写入就好 这其中不需要什么转换
Aolose
2025 年 2 月 11 日
@Aolose
偷懒失败 fsStream.on('data', a=>stream.write(a))

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1110759

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX