1 | # 中间件
|
2 |
|
3 | ## 中间件的存储
|
4 |
|
5 | 所有的用户自定义中间件存放于 app/middleware/ 目录下
|
6 |
|
7 | ## 中间件的书写
|
8 |
|
9 | 中间件的可索引名称就是存放中间件的文件名,每个文件中包含一个异步函数,如下所示:
|
10 |
|
11 | ```js
|
12 | /**
|
13 | * test
|
14 | * @param {MiddlewareParam} sofar
|
15 | */
|
16 | async function handle(sofar) {
|
17 | //取得当前用户对象,其内部结构为:
|
18 | // {
|
19 | // domain //用户域
|
20 | // openid //用户标识
|
21 | // sign //用户令牌
|
22 | // time //标识令牌有效期的时间戳
|
23 | // socket //通讯句柄
|
24 | // }
|
25 | let user = sofar.socket.user;
|
26 |
|
27 | //取得当前上行消息
|
28 | let msg = sofar.msg;
|
29 |
|
30 | //下行信息给客户端,执行失败时需要借此通知错误信息:
|
31 | sofar.fn({ code: ReturnCode.userIllegal });
|
32 |
|
33 | //终止当前中间件以及所有后续中间件的执行:
|
34 | sofar.recy = false;
|
35 | return;
|
36 | }
|
37 |
|
38 | //补充说明 - MiddlewareParam 定义如下:
|
39 | const MiddlewareParam = {
|
40 | socket:null, //通讯组件
|
41 | msg:{}, //消息
|
42 | fn: null, //回调函数
|
43 | recy:true, //中继标志:true 按顺序传递信息流到下一个中间件 false 终止传递
|
44 | facade: null //门面对象,访问各种全局服务的界面
|
45 | };
|
46 | ```
|
47 |
|
48 | ## 中间件的配置
|
49 |
|
50 | 中间件可以配置于各个控制器的 middleware 函数中,对输入流进行依序处理,例如:
|
51 |
|
52 | ```js
|
53 | class test extends facade.Control {
|
54 | get middleware() {
|
55 | return ['parseParams', 'commonHandle'];
|
56 | }
|
57 | }
|
58 | ```
|
59 | 如上代码指示对造访控制器test的信息流,依次应用 parseParams 和 commonHandle 这两个中间件进行处理
|
60 |
|
61 | 中间件的默认配置位于 CoreBase 类中:
|
62 |
|
63 | ```js
|
64 | class CoreOfBase
|
65 | {
|
66 | constructor($env) {
|
67 | //中间件设定,子类可覆盖
|
68 | this.middlewareSetting = {
|
69 | default: ['parseParams', 'commonHandle']
|
70 | };
|
71 | }
|
72 | }
|
73 | ``` |
\ | No newline at end of file |