Midway FaaS 在 HTTP/API 网关触发器,对请求出入参做了处理,尽可能规则化为 koa2 形式,所以,在一定程度上,可以兼容 koa2 的中间件。

Web 中间件分两类,全局中间件和单函数中间件,使用上有一些区别,但是都是通过 IoC 体系进行注入使用。

定义 Web 中间件

你可以在项目的子目录(比如 middleware 或者 mw)中创建中间件文件,比如 static.ts ,用于支持 koa-static

  1. // middleware/static.ts
  2. import { Provide, ScopeEnum, Scope, Config } from '@midwayjs/decorator';
  3. import * as serve from 'koa-static';
  4. @Provide('staticMiddleware')
  5. @Scope(ScopeEnum.Singleton)
  6. export class StaticMiddleware {
  7. @Config('static')
  8. staticConfig; // 在 config 中的配置
  9. resolve() {
  10. return serve(__dirname + '/test/fixtures', this.staticConfig);
  11. }
  12. }

也可以自由执行逻辑。

  1. import { Provide, ScopeEnum, Scope } from '@midwayjs/decorator';
  2. import * as serve from 'koa-static';
  3. @Provide('customMiddleware')
  4. @Scope(ScopeEnum.Singleton)
  5. export class StaticMiddleware {
  6. resolve() {
  7. return async (ctx, next) => {
  8. // xxxxx
  9. await next();
  10. // xxxxx
  11. }
  12. }
  13. }

使用

全局中间件

config.default.tsmiddleware 配置中填入上面定义的中间件 Provide 出的 id。

  1. // config.default.ts
  2. export const middleware = [ 'staticMiddleware' ];

函数级别 Web 中间件

@Func 装饰器的 middleware 属性写入 id。

  1. import { FunctionHandler, FaaSContext } from '@midwayjs/faas';
  2. import { Provide, Inject, Func } from '@midwayjs/decorator';
  3. @Provide()
  4. export class IndexHandler implements FunctionHandler {
  5. @Inject()
  6. ctx: FaaSContext;
  7. @Func('index.handler', { middleware: ['staticMiddleware'] })
  8. async handler() {
  9. return 'hello world';
  10. }
  11. }

已封装的中间件

Cookie

用于提供 Cookie 解析的能力。

安装方式
**
无 ,已默认开启。

使用
**
配置

  1. // 是否 cookies 加密
  2. export const cookies = {
  3. secure: false,
  4. };
  5. // cookie 加密 key
  6. export const keys = '';
  1. import {
  2. FunctionHandler,
  3. } from '@midwayjs/faas';
  4. import { Provide, Inject, Func } from '@midwayjs/decorator';
  5. @Provide()
  6. export class IndexHandler implements FunctionHandler {
  7. @Inject()
  8. ctx;
  9. @Func('index.handler')
  10. async handler() {
  11. // set cookie
  12. this.ctx.cookies.set('bbbb', 123);
  13. // get cookie
  14. this.ctx.cookies.get('bbb');
  15. }
  16. }

StaticFile

用于提供静态资源托管能力。

安装方式

  1. npm i @midwayjs/faas-middleware-static-file --save

使用
**
配置,和 koa-session 相同。

  1. // config
  2. exports.staticFile = {
  3. prefix: '/public/',
  4. dir: join(appInfo.baseDir, '../public')
  5. };

**

  1. import { FunctionHandler, FaaSContext } from '@midwayjs/faas';
  2. import { Provide, Inject, Func } from '@midwayjs/decorator';
  3. @Provide()
  4. export class IndexHandler implements FunctionHandler {
  5. @Inject()
  6. ctx: FaaSContext;
  7. @Func('index.handler', { middleware: ['fmw:staticFile'] })
  8. async handler() {
  9. }
  10. }

Upload

用于函数网关的文件上传能力

安装方式

  1. npm i @midwayjs/faas-middleware-upload --save

使用
**
配置:

  1. // config/config.default.ts
  2. export const upload = {
  3. mod: 'stream', // 支持三种模式,默认为stream,还支持buffer 和 file,对应的 file.data 分别为 ReadStream、File Data Buffer 和 临时文件地址
  4. }

添加组件:

  1. // configuration.ts
  2. import { Configuration } from '@midwayjs/decorator';
  3. @Configuration({
  4. importConfigs: ['./config/'],
  5. imports: ['@midwayjs/faas-middleware-upload']
  6. })
  7. export class ContainerConfiguration { }

使用:

  1. // index.ts
  2. import { FunctionHandler, FaaSContext } from '@midwayjs/faas';
  3. import { Provide, Inject, Func } from '@midwayjs/decorator';
  4. @Provide()
  5. export class IndexHandler implements FunctionHandler {
  6. @Inject()
  7. ctx: FaaSContext;
  8. @Func('index.handler', { middleware: ['fmw:upload'] })
  9. async handler() {
  10. const files = (this.ctx as any).files;
  11. /*
  12. files = [
  13. {
  14. filename: "20210118142906.jpg",
  15. data: FileReadStream, // 还支持其他模式,参照配置中的 mod 参数
  16. fieldname: "fileFormName",
  17. mimeType: "image/jpeg"
  18. }
  19. ]
  20. */
  21. const fields = (this.ctx as any).fields;
  22. /*
  23. fields = {
  24. formKey: formValue
  25. }
  26. */
  27. }
  28. }