1. 中间件
2. 创建一个中间件
先到src目录下,使用 nest g mi 中间件名称 。
logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('打印***req 中间件拦截', req.header);
next();
}
}
3. 使用中间件
中间件使用方式
- 指定地址
user.controller.ts
import { Global, Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { LoggerMiddleware } from 'src/logger/logger.middleware';
@Global()
@Module({
controllers: [UserController],
providers: [UserService],
exports: [UserService],
})
export class UserModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes('user');
}
}
- 配置对象形式
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes({
path: 'user',
method: RequestMethod.GET,
});
}
- 直接传入controller
consumer.apply(LoggerMiddleware).forRoutes(UserController);
2. 全局中间件
注意全局中间件只能使用函数模式 案例可以做白名单拦截之类的
main.ts
import { NestFactory } from '@nestjs/core';
import { NextFunction, Response, Request } from 'express';
import { AppModule } from './app.module';
const whiteList = ['/user'];
function middlewareWhole(req: Request, res: Response, next: NextFunction) {
console.log('打印***req.originalUrl', req.originalUrl);
if (whiteList.includes(req.originalUrl)) {
next();
} else {
console.log('全局拦截');
}
}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(middlewareWhole); // 不需要调用
await app.listen(3000);
}
bootstrap();
3.接入第三方中间件 cors
处理跨域
npm install cors
npm install @types/cors -D
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as cors from 'cors';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(cors());
await app.listen(3000);
}
bootstrap();