Skip to content

路由生成

NServe 提供了强大的路由生成功能,可以根据配置文件自动生成 Express 路由相关代码,包括路由处理器、业务逻辑模板和路由注册文件。

路由生成流程

  1. 创建路由配置文件nserve-config/router/ 目录下创建路由配置文件,例如 user.ts

  2. 编写路由配置

    typescript
    import { DefineGenRouter } from '@aicblock/nserve'
    
    export default DefineGenRouter({
      servicePath: '/api/user', // 路由前缀
      serviceHandler: 'user', // 处理逻辑目录
      routers: [
        {
          path: '/list',
          method: 'GET',
          name: 'list',
          middleware: []
        },
        {
          path: '/create',
          method: 'POST',
          name: 'create'
        },
        {
          path: '/:id',
          method: 'GET',
          name: 'detail'
        },
        {
          path: '/:id',
          method: 'PUT',
          name: 'update'
        },
        {
          path: '/:id',
          method: 'DELETE',
          name: 'delete'
        }
      ],
      middleware: ['auth'] // 全局中间件
    })
  3. 运行生成命令

    bash
    nserve gen
  4. 生成的文件 NServe 会自动生成以下文件:

    • 路由处理器文件 src/handler/user.handler.ts
    • 业务逻辑模板文件 src/logic/user/user.logic.ts
    • 路由注册文件 src/handler/router.ts

路由处理器

生成的路由处理器文件包含了路由的注册和参数验证逻辑:

typescript
import express from 'express'
import userList from '../logic/user/list.logic'
import userCreate from '../logic/user/create.logic'
import userDetail from '../logic/user/detail.logic'
import userUpdate from '../logic/user/update.logic'
import userDelete from '../logic/user/delete.logic'

const router = express.Router()

router.get('/list', userList)
router.post('/create', userCreate)
router.get('/:id', userDetail)
router.put('/:id', userUpdate)
router.delete('/:id', userDelete)

export default router

业务逻辑模板

生成的业务逻辑文件包含了空的方法模板,供开发者实现具体的业务逻辑:

typescript
import { Request, Response } from 'express'
import { ErrorResponse, SuccessResponse } from '@aicblock/nserve/lib/tools'

export async function ServiceLogic(req: Request, res: Response) {
  try {
    SuccessResponse(res)
  } catch (error) {
    ErrorResponse(res, error)
  }
}
export default ServiceLogic

路由注册

生成的路由注册文件将所有路由整合到一起:

typescript
import express from 'express'
import userRouter from './user.handler'

const router = express.Router()

router.use('/api/user', userRouter)

export default router

路由中间件

路由中间件可以在路由处理函数之前或之后执行,用于进行验证、日志记录、权限检查等操作。

js
// src/middleware/auth.middleware.ts
import type { Request, Response, NextFunction } from 'express'

const authMiddleware = (req: Request, res: Response, next: NextFunction) => {
  if (req.headers.token === '123456') {
    next()
  } else {
    ErrorResponse(res, new Error('token 无效'))
  }
}
export default authMiddleware

// nserve.config.ts
import { DefineNserveConfig } from '@aicblock/nserve'

export default DefineNserveConfig({
  ...,
  generateConfig: {
    middleware: {
      auth: { libName: '@/middleware/auth.middleware' }
    }
  }
})

路由配置选项

路由配置支持以下选项:

  • servicePath - 路由前缀
  • serviceHandler - 处理逻辑目录名
  • routers - 路由数组
    • path - 路由路径
    • method - HTTP 方法
    • name - 处理函数名
    • middleware - 路由级中间件
    • requestDataType - 路由请求数据类型定义
    • responseDataType - 路由响应数据类型定义
  • middleware - 全局中间件