You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Bun与Elysia时octet-stream内存泄漏问题求助

解决Elysia中GET /file/端点的内存泄漏问题

问题根源

直接返回Bun.file()生成的Blob对象时,高流量场景下框架会将整个文件内容加载到内存后再发送给客户端,大文件+高频请求会快速耗尽内存,且手动调用Bun.gc()无法有效回收这些内存(请求未完成时内存中的文件数据无法被释放)。

解决方案:用流式传输替代直接返回Blob

在Elysia中通过流式响应(利用file.stream())实现类似pipe()的效果,分块读取并发送文件,避免将整个文件加载到内存。

代码实现

import { Elysia } from 'elysia'

const app = new Elysia()
app.get('/file/:filename', async (ctx) => {
  // 构建文件路径(根据实际存储路径调整)
  const filePath = `./storage/${ctx.params.filename}`
  const file = Bun.file(filePath)

  // 检查文件是否存在
  if (!(await file.exists())) {
    ctx.set.status = 404
    return '文件不存在'
  }

  // 设置必要的响应头
  ctx.set.headers['Content-Type'] = await file.type()
  ctx.set.headers['Content-Length'] = (await file.size()).toString()
  // 可选:添加缓存策略,减少重复请求
  ctx.set.headers['Cache-Control'] = 'public, max-age=86400'

  // 返回流式响应,Bun会自动处理分块传输
  return new Response(file.stream())
})

app.listen(3000)

关键说明

  1. 流式传输优势:file.stream()返回一个ReadableStream,文件数据会分块读取并发送,每块数据发送完成后即可被GC回收,不会在内存中堆积完整的文件内容。
  2. 响应头设置:必须设置Content-Type和Content-Length,让客户端能正确识别文件类型和大小;添加Cache-Control可降低服务器请求压力。
  3. 错误处理:提前检查文件是否存在,避免返回无效的流导致客户端报错。

内容的提问来源于stack exchange,提问作者M336

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:03:19