跳到主要内容
版本:3.0.0

Web 中间件

Midway Hooks 支持通过函数 + useContext() 来定义 Web 中间件。

语法

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

基础示例

以记录请求日志为例:

import { Context } from '@midwayjs/koa';
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 Middleware
export default createConfiguration({
imports: [
hooks({
middleware: [logger],
}),
],
});

文件级中间件

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

import {
ApiConfig,
Api,
Get,
} from '@midwayjs/hooks';
import logger from './logger';

// File Level Middleware
export const config: ApiConfig = {
middleware: [logger],
};

export default Api(Get(), async () => {
return 'Hello World!';
});

单函数中间件

通过 Middleware(...middlewares: HooksMiddleware[]) 定义的中间件仅对单个函数生效

import {
Api,
Get,
Middleware,
} from '@midwayjs/hooks';
import logger from './logger';

export default Api(
Get(),
Middleware(logger),
async () => {
return 'Hello World!';
}
);

使用 Koa 中间件

你可以在上述的例子中直接传入 Koa 中间件。

@koa/cors 为例

全局启用:

import {
hooks,
createConfiguration,
} from '@midwayjs/hooks';
import logger from './logger';
import cors from '@koa/cors';

// Global Middleware
export default createConfiguration({
imports: [
hooks({
middleware: [logger, cors()],
}),
],
});

文件级别启用:

import {
ApiConfig,
Api,
Get,
} from '@midwayjs/hooks';
import logger from './logger';
import cors from '@koa/cors';

// File Level Middleware
export const config: ApiConfig = {
middleware: [logger, cors],
};

export default Api(Get(), async () => {
return 'Hello World!';
});

函数级别启用:

import {
Api,
Get,
Middleware,
} from '@midwayjs/hooks';
import logger from './logger';
import cors from '@koa/cors';

export default Api(
Get(),
Middleware(logger, cors),
async () => {
return 'Hello World!';
}
);