如何在Hono中使用serveStatic函数实现文件下载功能?
如何在Hono中实现静态文件下载服务
你的serveStatic配置存在问题,root参数不需要添加/*通配符,它应该指向静态文件所在的目录路径,而非带通配符的路径。下面给出两种正确的实现方式:
方式一:用serveStatic托管静态目录(对应Express的express.static)
这种方式适合直接托管整个静态文件夹,无需额外自定义逻辑:
import { Hono } from 'hono' import { serveStatic } from '@hono/node-server/serve-static' import path from 'path' const app = new Hono() // 正确配置静态文件服务 app.use('/files/*', serveStatic({ root: path.join(__dirname, 'files') // 传入静态目录的绝对路径,不要加通配符 })) // 启动服务器 import { serve } from '@hono/node-server' serve({ fetch: app.fetch, port: 3000 })
配置说明:
/files/*是路由匹配规则,所有以/files/开头的请求都会触发该中间件root指定静态文件所在的目录,Hono会自动根据请求路径(比如/files/report.pdf)去该目录下查找对应文件并返回
方式二:自定义GET路由处理文件请求(对应Express的GET /files/:filename)
如果需要在返回文件前添加自定义逻辑(比如权限校验、日志),可以用这种方式:
import { Hono } from 'hono' import path from 'path' const app = new Hono() // 自定义文件下载路由 app.get('/files/:filename', async (c) => { const filename = c.req.param('filename') const filePath = path.join(__dirname, 'files', filename) // 这里可以添加自定义逻辑,比如检查文件是否存在、权限验证等 // 用Hono的sendFile方法返回文件 return c.sendFile(filePath) }) // 启动服务器 import { serve } from '@hono/node-server' serve({ fetch: app.fetch, port: 3000 })
说明:Hono的c.sendFile方法和Express的res.sendFile功能类似,会自动处理文件的MIME类型和下载响应。
内容的提问来源于stack exchange,提问作者Assaf Fogelman אסף פוגלמן
相关产品推荐
相关产品推荐

