如何在Elysia中根据请求头调整路由规则?
解决Elysia.js根据Accept头切换路由的方案
核心思路
利用Elysia生命周期的onRequest钩子(在路由匹配前执行),检查请求的Accept头:
- 若包含
application/json,重写请求路径到指定的JSON接口路由 - 否则保持原路径,交由静态文件插件处理
实现代码
import { Elysia } from 'elysia' import { staticPlugin } from '@elysiajs/static' const app = new Elysia() // 在路由匹配前处理请求头 .onRequest(({ request }) => { const accept = request.headers.get('Accept') // 检查Accept头是否包含application/json if (accept?.includes('application/json')) { // 重写请求路径到JSON接口路由 request.url = new URL('/api', request.url) } }) // 定义返回JSON的路由 .get('/api', () => ({ status: 'success', data: '这是JSON格式的响应' })) // 挂载静态文件服务,处理非JSON请求 .use(staticPlugin({ assets: 'public', // 静态文件目录 prefix: '/' })) .listen(3000) console.log(`服务器运行在 http://${app.server?.hostname}:${app.server?.port}`)
方案说明
onRequest钩子处于Elysia的Request阶段,早于路由匹配执行,能在路由选择前修改请求参数- 通过重写
request.url,让符合条件的请求匹配到我们定义的JSON接口路由 - 静态文件插件会处理所有未匹配到API路由的请求,实现自动回退
替代方案(直接在根路由判断)
如果不想修改请求路径,也可以在根路由中直接判断请求头,手动分发逻辑:
import { Elysia } from 'elysia' import { staticPlugin, serveStatic } from '@elysiajs/static' new Elysia() .get('/', async ({ request, set }) => { const accept = request.headers.get('Accept') if (accept?.includes('application/json')) { return { data: 'JSON响应' } } // 手动返回静态文件(这里以index.html为例) return serveStatic('public/index.html', set) }) .use(staticPlugin({ assets: 'public', prefix: '/', // 排除根路径,避免和自定义路由冲突 ignorePatterns: ['/'] })) .listen(3000)
内容的提问来源于stack exchange,提问作者death_au
相关产品推荐
相关产品推荐

