CORS 与 Logger
CORS 和日志是 API 项目最常见的中间件。Hono 内置了 cors 和 logger,可以直接使用。
启用 Logger
import { Hono } from 'hono'
import { logger } from 'hono/logger'
const app = new Hono()
app.use(logger())
app.get('/health', (c) => c.json({ ok: true }))
Logger 会输出请求方法、路径、响应状态码和耗时,适合开发环境快速观察请求。
生产环境中,建议使用结构化日志,把请求 ID、用户 ID、状态码、耗时和错误信息输出到日志平台。
启用 CORS
import { cors } from 'hono/cors'
app.use('/api/*', cors())
如果前端和 API 不在同一个域名下,就需要配置 CORS。
指定跨域来源
app.use(
'/api/*',
cors({
origin: 'https://example.com',
allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowHeaders: ['Content-Type', 'Authorization'],
credentials: true,
}),
)
多个来源:
const allowedOrigins = ['https://app.example.com', 'https://admin.example.com']
app.use(
'/api/*',
cors({
origin: (origin) => {
return allowedOrigins.includes(origin) ? origin : ''
},
credentials: true,
}),
)
注册顺序
CORS 应该在业务路由之前注册:
app.use('/api/*', cors())
app.get('/api/users', (c) => {
return c.json([])
})
如果 CORS 注册太晚,浏览器的预检请求可能无法得到正确响应。
常见问题
| 问题 | 原因与处理 |
|---|---|
| 浏览器提示 CORS 错误 | 检查 origin、方法、请求头是否被允许。 |
| 携带 Cookie 失败 | 需要 credentials: true,前端请求也要设置 credentials。 |
| 预检请求失败 | 确认 CORS 中间件注册在路由前面。 |
| 本地开发正常,线上失败 | 检查线上域名是否加入允许列表。 |
不要在生产环境随意使用 origin: '*' 加凭证请求。公开 API 可以放宽来源,后台管理、用户态接口应该明确来源。
相关内容
- Hono 是什么 介绍 Hono 的定位、核心特点、Web Standards 思路、多运行时能力,以及它与传统 Node.js Web 框架的差异。
- 安装和 Hello World 学习使用 create-hono 创建 Hono 项目,分别了解通用模板和 Node.js 模板的 Hello World 写法。
- 运行时选择 对比 Hono 在 Node.js、Cloudflare Workers、Bun、Deno 等运行时中的入口写法、部署方式和适用场景。
- 路由基础 学习 Hono 的 GET、POST、动态参数、通配符、路由分组和模块化路由写法。
- Context 详解 介绍 Hono Context 的 req、json、text、html、redirect、header、status、set、get 等常用 API。
- 中间件机制 学习 Hono 中间件的执行顺序、自定义中间件写法、路径匹配、next 调用和常见使用场景。