JianghuJS-自定义中间件
120021、概念
- JianghuJS 中间件是啥
在 JianghuJS 中,中间件的概念和 Egg.js 中的中间件类似。中间件是一种插件机制,通过 app.middleware 属性添加到应用程序中。每个中间件都是一个函数,接收两个参数:ctx(上下文对象)和 next(下一个中间件)。在 HTTP 请求被发送到应用程序时,中间件会按照添加的顺序先处理请求,然后将请求传递给下一个中间件,直到所有中间件都执行完成,最终得到响应并返回给客户端。
中间件的主要作用包括:
处理请求和响应的逻辑:中间件可以在请求到达控制器之前或响应离开控制器之前执行逻辑。这允许在请求和响应之间进行一些处理,如权限验证、日志记录等。
修改上下文对象(ctx):中间件可以在 ctx 对象中设置和读取请求的状态和信息,以便在后续中间件或控制器中使用。
调用下一个中间件:通过调用 next() 函数,中间件可以将请求传递给下一个中间件。这样,一系列的中间件就形成了一个“流水线”,按照顺序依次执行。
总体而言,中间件是一种强大的工具,用于对请求和响应进行预处理、处理一些通用的逻辑、提供全局性的功能等。在 JianghuJS 中,开发者可以根据需求编写自定义中间件,以满足项目的特定要求。
2、如何自定义中间件
配置
- 配置文件:
/config/middlewareConfig.js middlewareConfig中的配置,会自动合并到config配置中,框架会自动按照一下数组顺序执行相应的中间件方法;
- 配置文件:
执行顺序
module.exports.middleware = [// cache'prepareCache',// /upload/*'downloadUserInfo',// /page/*'pagePackage', 'pageUserInfo', 'pageAuthorization',// /pageDoc/*'pageDocPackage', 'pageDocUserInfo', 'pageDocAuthorization',// /resource/*'httpPackage', 'httpUserInfo', 'httpAuthorization', 'httpResourceHook'];
- 执行条件
middlewareMatch 按照条件判断是否执行该中间件,不添加在Match的中间件会默认执行;
module.exports.middlewareMatch = {pagePackage: {match(ctx) {// url 格式符合 /appId/page/pageIdreturn ctx.request.method === 'GET'&& ctx.request.path.startsWith(`/${ctx.app.config.appId}/page/`);},},...}
- 创建中间件
/app/middleware 目录下,每一个js就是一个中间件,文件名与上方middleware配置同名;
├── middlewareUtil│ ├── packageUtil.js│ └── userInfoUtil.js├── downloadUserInfo.js├── httpAuthorization.js├── httpPackage.js├── httpResourceHook.js├── httpUserInfo.js├── pageAuthorization.js├── pageDocAuthorization.js├── pageDocPackage.js├── pageDocUserInfo.js├── pageHook.js├── pagePackage.js├── pageUserInfo.js├── socketAuthorization.js├── socketPackage.js├── socketPackageRecord.js├── socketResourceAfterHook.js├── socketResourceBeforeHook.js├── socketUserInfo.js├── xiaochengxuAuthorization.js├── xiaochengxuPackage.js├── xiaochengxuPackageRecord.js├── xiaochengxuPageAuthorization.js├── xiaochengxuPagePackage.js├── xiaochengxuResourceAfterHook.js├── xiaochengxuResourceBeforeHook.js└── xiaochengxuUserInfo.js