日韩av无码中文字幕,国产午夜亚洲精品国产成人小说,成人影院午夜男女爽爽爽,欧美 亚洲 中文 国产 综合

首頁 熱點 要聞 國內(nèi) 產(chǎn)業(yè) 財經(jīng) 滾動 理財 股票

【NestJS系列】核心概念:Middleware中間件

2023-08-29 08:26:53 來源 : 博客園

前言

用過expresskoa的同學,對中間件這個概念應該非常熟悉了,中間件可以拿到RequestResponse對象和next函數(shù).

一般來講中間件有以下作用:


(資料圖片)

執(zhí)行任何代碼對請求與響應攔截并改造結束request-response周期通過next()調(diào)用下一個中間件如果當前中間件沒有結束當前request-response周期,必須調(diào)用next()函數(shù),否則請求會處于掛起狀態(tài),阻塞整個應用

中間件一般有兩種:類中間件函數(shù)中間件

類中間件創(chuàng)建類中間件

使用@Injectable()裝飾器,并且需要實現(xiàn)NestMiddleware接口(use方法)

// Logger.middleware.tsimport { Injectable, NestMiddleware } from "@nestjs/common";import { Request, Response } from "express";@Injectable()export class LoggerMiddleware implements NestMiddleware {    use(req: Request, res: Response, next: () => void) {        console.log("logger middleware", `url: ${req.url}`);        next();    }}
使用類中間件

類中間創(chuàng)建完之后,需要在模塊中進行掛載,但@Module裝飾器并沒有中間件的相關配置,我們需要讓module類實現(xiàn)NestModule接口,實現(xiàn)里面configure方法來進行掛載

// user.module.tsimport { Module, NestModule } from "@nestjs/common";import { UserService } from "./user.service";import { UserController } from "./user.controller";import { LoggerMiddleware } from "../middleware/Logger.middleware";@Module({  controllers: [UserController],  providers: [UserService]})export class UserModule implements NestModule {  configure(consumer) {    consumer      .apply(LoggerMiddleware)      .forRoutes(UserController);  }}
apply方法表示掛載的是哪個中間件forRoutes方法表示對哪個請求路徑起作用,這種方式與app.use(path, middleware)作用是一樣,只針對部分路徑起作用當給forRoutes方法傳遞的是一個controller控制器時,那么該中間件則對整個控制器下的路徑生效

比如這里傳遞的是UserController控制器,那么針對該控制器下的路徑都會生效

forRootes方法還能做更詳細的配置,比如可以針對特定的請求方法、請求路徑可以使用正則匹配(需要注意的是使用fastify驅動不能使用)
export class UserModule implements NestModule {  configure(consumer) {    consumer      .apply(LoggerMiddleware)      .forRoutes({ path: "user", method: RequestMethod.GET});  }}
apply可以同時掛載多個中間件
export class UserModule implements NestModule {  configure(consumer) {    consumer      .apply(LoggerMiddleware, aaaMiddleware, ...)      .forRoutes({ path: "user", method: RequestMethod.GET});  }}
forRoutes可以使用單個string路徑,多個string路徑,RouteInfo對象,單個Controller,多個Controller
export class AppModule implements NestModule {  configure(consumer) {    consumer      .apply(LoggerMiddleware, NjMiddleware, ...)      .forRoutes(UserController, NjController, ...);  }}
exclude可以用來排除不使用中間件的路徑
export class UserModule implements NestModule {  configure(consumer) {    consumer      .apply(LoggerMiddleware)      .exclude({ path: "/user/a", method: RequestMethod.GET})      .forRoutes(UserController);  }}

需要注意的是forRoutes需要最后調(diào)用

函數(shù)中間件

這種方式較為簡單,使用起來與類中間件一致

創(chuàng)建函數(shù)中間件
export function LoggerMiddleware(req: Request, res: Response, next: () => void) {    console.log("logger middleware", `url: ${req.url}`);    next();}
使用函數(shù)中間件
export class UserModule implements NestModule {  configure(consumer) {    consumer      .apply(LoggerMiddleware)      .exclude({ path: "/user/a", method: RequestMethod.GET})      .forRoutes(UserController);  }}
全局中間件

可以直接在入口文件main.ts中使用app.use來掛載中間件,這樣掛載的中間件將全局生效

app.use(LoggerMiddleware) // 日志中間件

中間件其實可以用來實現(xiàn)很多功能,比如:日志系統(tǒng)、cors跨域處理、圖片防盜等...

對圖片防盜感興趣的可以看我這篇文章:你不知道的 HTTP Referer

關鍵詞:
相關文章

最近更新
精彩推送
廝磨完整版 廝磨 2023-08-29 08:27:25
三星w999(w899) 2023-08-29 08:19:53