Skip to content

路由系统

重要提示:Yumeri框架目前处于快速迭代阶段,本文档中的API可能随时发生变化。请始终以GitHub仓库中的最新代码为准:https://github.com/yumerijs/yumeri

路由系统简介

Yumeri框架的路由系统提供灵活的路径匹配和处理机制。你可以通过函数式 API 或装饰器 API 来定义路由。

注册路由

路由注册将处理逻辑绑定到特定路径:

typescript
ctx.route('/user/:id')
    .action((session, params, id) => {
        session.respond('user id: ' + id, 'plain');
    })
typescript
import { Plugin, Get } from '@yumerijs/decorator';

@Plugin
export default class UserController {
  @Get('/user/:id')
  async getUser(session, params, id) {
    session.respond('user id: ' + id, 'plain');
  }
}

路由规则

Yumeri框架的路由规则遵循类 Express 语法,支持多种规则:

  • 路径参数:/user/:id
  • 查询参数:/user?id=123
  • 可选参数:/user/:id?
  • 正则表达式支持

路由方法

设置路由支持的 HTTP 方法:

typescript
ctx.route('/user/:id')
    .action((session, params, id) => {
        session.respond('user id: ' + id, 'plain');
    })
    .methods('get', 'post')

装饰器模式默认根据使用的装饰器(如 @Get)自动设置方法:

typescript
import { Plugin, Get, Post } from '@yumerijs/decorator';

@Plugin
export default class UserController {
  @Get('/user/:id')
  async getUser(session, params, id) {
    session.respond('user id: ' + id, 'plain');
  }

  @Post('/user')
  async createUser(session) {
    session.respond('created', 'plain');
  }
}

高级装饰器用法

在装饰器模式中,你可以使用函数动态解析路径或主机名。@Host 装饰器的功能等同于函数式 API 中的 .host() 方法。

typescript
import { Plugin, Get, Host } from '@yumerijs/decorator';

@Plugin
export default class EchoPlugin {
  constructor(_ctx: Context, private config: any) {}

  @Get((plugin: EchoPlugin) => `/${plugin.config.path}`)
  @Host((plugin: EchoPlugin) => plugin.config.host || undefined)
  async echo(session: Session) {
    session.setMime('text/plain');
    session.respond('Echo content', 'plain');
  }
}

路由中间件

中间件允许你在路由处理之前或之后执行逻辑:

typescript
ctx.route('/user/:id')
    .use((session, next) => {
        console.log('before action');
        next();
    })
    .action((session, params, id) => {
        session.respond('user id: ' + id, 'plain');
    })

使用 @Use 装饰器挂载中间件:

typescript
import { Plugin, Get, Use } from '@yumerijs/decorator';

@Plugin
export default class UserController {
  @Get('/user/:id')
  @Use(async (session, next) => {
    console.log('before action');
    await next();
  })
  async getUser(session, params, id) {
    session.respond('user id: ' + id, 'plain');
  }
}