API 版本控制

优质
小牛编辑
134浏览
2023-12-01

Eggjs resfulApi 路由版本控制

配置

插件配置

// {app_root}/config/plugin.js
exports.routerPlus = {
  enable: true,
  package: 'egg-router-plus',
};

使用


module.exports =  app  => {
  const { router, controller } = app;
  const apiV1Router = router.namespace('/api/v1')
  apiV1Router.post('/home', controller.home.index)
};

特点

加载 app/router/**/*.js

此插件将自动加载路由器定义为 app/router/**/*.js

注意:所有分路由器都将在 app/router.js 此之前加载。请确保所有子路由器定义都不冲突,app.router.namespace 为每个子路由器文件创建不同的名称空间。

app.router.namespace

app.router.namespace(prefix, ...middlewares);
  • prefix - {String},子路由器的前缀字符串
  • middlewares - {...Function},可选组中间件

支持路由器:

  • router.verb('path-match', app.controller.action);
  • router.verb('path-match', middleware1, ..., middlewareN, app.controller.action);
  • router.verb('router-name', 'path-match', app.controller.action);
  • router.verb('router-name', 'path-match', middleware1, ..., middlewareN, app.controller.action);

注:prefixpath 是不允许的 regex,和 prefix 不能是 /。

// {app_root}/app/router.js
module.exports = app => {
  const subRouter = app.router.namespace('/sub');
  // curl localhost:7001/sub/test
  subRouter.get('/test', app.controller.sub.test);
  subRouter.get('sub_upload', '/upload', app.controller.sub.upload);

  // const subRouter = app.router.namespace('/sub/:id');
  // const subRouter = app.router.namespace('/sub', app.middleware.jsonp());

  // output: /sub/upload
  console.log(app.url('sub_upload'));
};

已知问题

  • redirect 不支持,使用 app.router.redirect() 或者重定向到指定的路由器。
const subRouter = app.router.namespace('/sub');

// will redirect `/sub/go` to `/anyway`, not `/sub/anyway`
subRouter.redirect('/go', '/anyway');

// just use router
router.redirect('/sub/go', '/sub/anyway');

// or redirect to a named router
subRouter.get('name_router', '/anyway', app.controller.sub.anyway);
// will redirect `/sub/go_name` to `/sub/anyway` which is named `name_router`
subRouter.redirect('/sub/go_name', 'name_router');