a6eebb940f
* feat: improve code * feat: update docs * feat: update docs * Update index.md * Update features.md * Update when.md * Update contributing.md * Update translations.md * feat: clean up * Add files via upload * Update the-first-app.md * Update plugins.md * Update a-b-c.md * Update blocks.md * feat: update docs * Add files via upload * Update charts.md * feat: update navs * Update index.md * Update index.md * Update features.md * Update index.md * Update docker-compose.md * Update create-nocobase-app.md * Update git-clone.md * Update contributing.md * Update translations.md * Update plugins.md * Update the-first-app.md * Add files via upload * Update charts.md * Update charts.md * Update a-b-c.md * Update collections.md * Update menus.md * Update menus.md Co-authored-by: Zhou <zhou.working@gmail.com>
3.1 KiB
3.1 KiB
中间件
添加方法
app.acl.use()
添加资源权限级中间件,在权限判断之前执行app.resourcer.use()
添加资源级中间件,只有请求已定义的 resource 时才执行app.use()
添加应用级中间件,每次请求都执行
洋葱圈模型
app.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(1);
await next();
ctx.body.push(2);
});
app.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(3);
await next();
ctx.body.push(4);
});
访问 http://localhost:13000/api/hello 查看,浏览器响应的数据是:
{"data": [1,3,4,2]}
内置中间件及执行顺序
cors
bodyParser
i18n
dataWrapping
db2resource
restApi
parseToken
checkRole
acl
acl.use()
添加的其他中间件
resourcer.use()
添加的其他中间件- action handler
app.use()
添加的其他中间件
也可以使用 before
或 after
将中间件插入到前面的某个 tag
标记的位置,如:
app.use(m1, { tag: 'restApi' });
app.resourcer.use(m2, { tag: 'parseToken' });
app.resourcer.use(m3, { tag: 'checkRole' });
// m4 将排在 m1 前面
app.use(m4, { before: 'restApi' });
// m5 会插入到 m2 和 m3 之间
app.resourcer.use(m5, { after: 'parseToken', before: 'checkRole' });
如果未特殊指定位置,新增的中间件的执行顺序是:
- 优先执行 acl.use 添加的,
- 然后是 resourcer.use 添加的,包括 middleware handler 和 action handler,
- 最后是 app.use 添加的。
app.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(1);
await next();
ctx.body.push(2);
});
app.resourcer.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(3);
await next();
ctx.body.push(4);
});
app.acl.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(5);
await next();
ctx.body.push(6);
});
app.resourcer.define({
name: 'test',
actions: {
async list(ctx, next) {
ctx.body = ctx.body || [];
ctx.body.push(7);
await next();
ctx.body.push(8);
},
},
});
访问 http://localhost:13000/api/hello 查看,浏览器响应的数据是:
{"data": [1,2]}
访问 http://localhost:13000/api/test:list 查看,浏览器响应的数据是:
{"data": [5,3,7,1,2,8,4,6]}
resource 未定义,不执行 resourcer.use() 添加的中间件
app.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(1);
await next();
ctx.body.push(2);
});
app.resourcer.use(async (ctx, next) => {
ctx.body = ctx.body || [];
ctx.body.push(3);
await next();
ctx.body.push(4);
});
访问 http://localhost:13000/api/hello 查看,浏览器响应的数据是:
{"data": [1,2]}
以上示例,hello 资源未定义,不会进入 resourcer,所以就不会执行 resourcer 里的中间件
中间件用途
待补充
完整示例
待补充
- samples/ratelimit IP rate-limiting