如何使用Hono返回提前响应并继续执行后续代码
解决Hono中提前返回响应并后台执行任务的问题
核心思路
Hono的请求处理逻辑要求必须返回响应对象来完成请求周期,无法像Google Cloud函数那样直接发送响应后继续执行后续代码。要实现"提前响应+后台任务",可以借助Bun的异步任务特性,在返回响应后启动不等待完成的后台逻辑。
具体实现代码
import { Hono } from 'hono' import { StatusCode } from 'hono/utils/http-status' const app = new Hono() app.post('/backup', async (c) => { // 1. 构建并准备返回202 Accepted响应 c.status(StatusCode.Accepted) const response = c.json({ status: 'accepted', message: '备份任务已在后台启动' }) // 2. 启动独立异步任务执行备份逻辑(不使用await,直接后台运行) ;(async () => { try { // 替换为实际的备份操作代码 console.log('开始执行备份') // 模拟备份耗时操作 await new Promise(resolve => setTimeout(resolve, 5000)) console.log('备份完成') } catch (err) { // 后台任务错误处理,比如写入日志 console.error('备份失败:', err) } })() // 3. 返回响应,结束请求周期 return response }) export default app
关键注意点
- 后台任务不能依赖请求上下文(
c对象),请求返回响应后上下文会被销毁 - 必须为后台任务添加错误捕获,避免静默失败
- 如果需要更高可靠性的任务处理,可以结合Bun内置的
Bun.queue功能,确保任务在进程重启后仍能被执行
内容的提问来源于stack exchange,提问作者Greg Forel
相关产品推荐
相关产品推荐

