使用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)
关键说明
- 流式传输优势:
file.stream()返回一个ReadableStream,文件数据会分块读取并发送,每块数据发送完成后即可被GC回收,不会在内存中堆积完整的文件内容。 - 响应头设置:必须设置
Content-Type和Content-Length,让客户端能正确识别文件类型和大小;添加Cache-Control可降低服务器请求压力。 - 错误处理:提前检查文件是否存在,避免返回无效的流导致客户端报错。
内容的提问来源于stack exchange,提问作者M336
相关产品推荐
相关产品推荐

