You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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}`)

方案说明

  1. onRequest钩子处于Elysia的Request阶段,早于路由匹配执行,能在路由选择前修改请求参数
  2. 通过重写request.url,让符合条件的请求匹配到我们定义的JSON接口路由
  3. 静态文件插件会处理所有未匹配到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:52:46