路由工厂 - 985ch/egg-sachikawa GitHub Wiki

作为后端项目,sachikawa并没有采取和egg.js一样的统一路由管理方式,而是采取了通过项目路径映射来使每个脚本文件对应一个(或一组)路由的方案。而这个方案的实现,则依赖于路由工厂插件egg-router-factory。
而这个路由工厂插件的主要作用有两个:

  • 扫描app/http目录,根据目录下的路由脚本文件生成对应的路由
  • 解析路由脚本文件,根据脚本文件启用不同的中间件,并最终生成http接口

路由映射规则

在默认情况下,路由的地址是由每个路由脚本对app/http目录的相对地址决定的。例如:开发者创建了路由脚本app/http/get/api/userdata.js,由于这个脚本相对于app/http的路径是get/api/userdata.js那么这个脚本对应的路由就是api/userdata,其调用方法则是GET。若开发者创建了路由脚本app/http/post/send.js则会得到一个类型为POST,路由为send的接口,以此类推。
除了依靠路径来生成路由外,还可以在路由脚本中利用path属性直接指定路由路径。若非为了生成一组路径,一般情况下不建议使用该属性。例如:开发者创建了一个脚本app/http/get/rpc.js,并在这个脚本里配置了path="/rpc/:operate",那么无论通过rpc/abc还是rpc/123都可以访问到这个脚本。
路由脚本的具体写法请查阅接口文件一节。

factory脚本

factory脚本用于扩展sachikawa框架自带的路由工厂。如果开发者需要让路由脚本支持更多的配置属性,就可以在项目中添加这个脚本来覆盖框架原本的factory.js来实现。
以下例子演示了如何通过重写factory脚本来让接口根据userauth参数来配置一个同名的中间件

// app/factory.js
'use strict';
const { RouterFactory } = require('egg-sachikawa');

class MyFactory extends RouterFactory {
  // 根据配置把中间件添加到参数
  setMiddlewares(obj, args) {
    super.setMiddlewares(obj, args);
    const app = this.app;
    if(obj.userauth) args.push(app.middlewares.userauth(obj.userauth)); // 若配置了userauth则以其为参数启用userauth中间件
  }
}

module.exports = MyFactory;

关于factory文件的更多内容请参考egg-router-factory项目

自定义中间件

sachikawa框架虽然已经集成了大量的中间件,但是这些中间件都不涉及具体业务。而在实际的项目中,我们通常都会需要一些涉及具体业务的中间件。例如:用户身份验证,参数加密校验等。
中间件写法可以参考egg.js的相关文档。但是需要注意的是,在sachikawa框架里通常是使用路由工厂来动态加载中间件,中间件的配置也是从接口文件里获取而不是把中间件作为配置写到配置文件中。

⚠️ **GitHub.com Fallback** ⚠️