Skip to main content

Web 中间件

在 2.0 版本中,Midway Hooks 支持三种形式的中间件,用来覆盖不同的使用诉求。

  • 2.0 全局,对所有 Api 调用都生效
  • 2.0 文件,对文件内部所有 Api 生效
  • 1.0 函数,仅对该 Api 函数生效

语法#

中间件仅有 next 一个参数,ctx 需要通过 useContext 获得。你也可以在中间件中使用任意的 Hooks

Logger 中间件

import { Context } from '@midwayjs/faas';import { useContext } from '@midwayjs/hooks';
const logger = async (next: any) => {  const ctx = useContext<Context>();
  console.log(`<-- [${ctx.method}] ${ctx.url}`);
  const start = Date.now();  await next();  const cost = Date.now() - start;
  console.log(`[${ctx.method}] ${ctx.url} ${cost}ms`);};

全局中间件#

全局中间件在 configuration.ts 中定义,可以传入任何框架支持的中间件

import { hooks, createConfiguration } from '@midwayjs/hooks';import logger from './logger';
// Global Middlewareexport default createConfiguration({  imports: [    hooks({      middleware: [logger],    }),  ],});

文件级中间件#

文件级中间件在 Api 文件中定义,通过导出 config.middleware,使得其对该文件内所有 Api 函数生效。

import { ApiConfig } from '@midwayjs/hooks';import logger from './logger';
// File Level Middlewareexport const config: ApiConfig = {  middleware: [logger],};
export default async (message: string) => {  return { type: 'POST', message };};

单函数中间件#

单函数中间件即只针对单个函数生效的 Web 中间件。

在 Midway Hooks 中,可以通过 withController 来支持单函数级别的中间件。 ​

使用函数中间件

import { withController } from '@midwayjs/hooks';import { Context } from '@midwayjs/faas';
const logger = async (next) => {  const ctx: Context = useContext();
  const start = Date.now();  await next();  const cost = Date.now() - start;  console.log(`request ${ctx.url} cost ${cost}ms`);};
export default withController(  {    middleware: [logger],  },  () => {    return 'Hello Controller';  });

使用 IoC 中间件

import { withController } from '@midwayjs/hooks';import { Context } from '@midwayjs/faas';import { Provide, ScopeEnum, Scope } from '@midwayjs/decorator';
@Provide('classMiddleware')@Scope(ScopeEnum.Singleton)export class ClassMiddleware {  resolve() {    return async (ctx: Context, next) => {      ctx.query.from = 'classMiddleware';      await next();    };  }}
export default withController(  {    middleware: ['classMiddleware'],  },  () => {    return 'Hello Controller ' + ctx.query.from;  });

API#

withController#

通过 withController 增强函数功能,第一个参数是 controller 配置,第二个参数是要执行的 FaaS 函数。

其中 controller 配置如下

  • middleware(any[]):可选参数,用于给当前的函数增加中间件功能,可以同时传入多个中间件。支持函数定义的中间件及 IoC 定义的中间件。

类型定义

type Controller = {  middleware?: any[];};
function withController(controller: Controller, func);