میان افزار در nest.js – انجمن DEV

قبل از نوشتن هر خط کد، اجازه دهید ابتدا یک تابع میانافزار را در nest.js تعریف کنیم، یک تابع میانافزار تابعی است که قبل از تابع کنترل مسیر فراخوانی میشود، توابع میانافزار به اشیاء درخواست و پاسخ دسترسی دارند، تعریف خوبی است، درست است؟ اما به چه معنا است؟ به سادگی یک تابع میانافزار تابعی است که قبل از تابع درخواست اصلی راهاندازی میشود، میتواند چرخه عمر درخواست را پایان دهد یا چرخه عمر درخواست را ادامه دهد، پایان ندادن و ادامه ندادن درخواست را معلق میگذارد که برای تجربه کاربران فاجعهبار است. تابع میانافزار میتواند شی درخواست را تغییر دهد، مانند افزودن دادههایی که به پایگاه داده میرسند، فقط هر کاری را که میتوانید در هر تابع عادی انجام دهید، انجام دهید.
نوشتن خیلی زیاد است، پس اجازه دهید آن را در عمل ببینیم، اما اجازه دهید ابتدا برنامه خود را ایجاد کنیم
new nest middleware
همانطور که می بینید، من Nest را به صورت سراسری بر روی دستگاه خود نصب کرده ام، اگر هنگام ایجاد برنامه با مشکلی مواجه شدید، لطفاً از راهنمای زیر از وب سایت رسمی nest.js https://docs.nestjs.com/ استفاده کنید.
میان افزار اولیه
برای ایجاد میانافزار nest.js میتوانید از رویکرد کلاس استفاده کنید یا از رویکرد تابع استفاده کنید، اما برای این مثال، از رویکرد پایه کلاس که توسط تیم nest.js توصیه میشود استفاده میکنیم، در مثال زیر یک تابع میانافزار ایجاد میکنیم که رشته خوشامدگویی به بدنه درخواست ما ارسال شده و بررسی کنید که آیا احوالپرسی برابر با hello است، اگر احوالپرسی hello نیست تابع میانافزار درخواست را برمیگرداند، و اگر سلام ارسال شده به بدنه درخواست hello باشد، تابع میانافزار چرخه درخواست را ادامه میدهد. و یک داده جدید به بدن درخواست ما اضافه کنیم،
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";
@Injectable()
export class greetingMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
if (req.body.greeting === 'hello') {
req.body.randomNumber = Math.random();
next()
} else {
return res.status(403).json({ message: "no greeting passed or not equal to hello " });
}
}
}
تزریق وابستگی
مانند کنترلرها و ارائه دهندگان، میان افزارها نیز می توانند وابستگی هایی را که در یک ماژول هستند تزریق کنند
بکارگیری میان افزارها
همانطور که من، شما ممکن است فکر کنید که میان افزارها در آن قرار می گیرند @module
دکوراتور اما اینطور نیست، در عوض، ما آنها را با استفاده از آن تنظیم می کنیم configure()
روش کلاس ماژول، ماژول هایی که حاوی میان افزار هستند باید آن را پیاده سازی کنند NestModule
رابط، اجازه دهید ببینیم که چگونه می توان سلام جنگ را اعمال کرد
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { greetingMiddleware } from './middleware/basicMiddleware';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(greetingMiddleware).forRoutes('greeting')
}
}
در مثال بالا ما عبارت را اعمال می کنیم greetingMiddlewar
به مسیر خوشامدگویی با استفاده از forRootes()
همچنین میتوانیم میانافزار را به روشهای درخواستی خاص با ارسال یک شی به آن محدود کنیم forRootes
روشی که شامل مسیر و متد است، توجه داشته باشید که شما محدود به یک مسیر نیستید، میتوانید میانافزار خود را به بیش از یک مسیر منتقل کنید یا آن را به کل کنترلر ارسال کنید، در مثال زیر میبینیم که چگونه میانافزار خود را با روش درخواست خاص اعمال کنیم.
import { Module, NestModule, MiddlewareConsumer,RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { greetingMiddleware } from './middleware/basicMiddleware';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(greetingMiddleware).forRoutes({ path: 'greeting', method: RequestMethod.GET })
}
}
هنگام استفاده از این روش، لطفاً وارد کردن را فراموش نکنید RequestMethod
به ما کمک می کند تا به روش درخواست هدفمند ارجاع دهیم.
اعمال به کنترلر کل
در برخی موارد ممکن است بخواهید میان افزار خود را به تمام مسیرهای موجود در خود منتقل کنید @controller
، برای انجام این کار باید کنترلر وارد شده خود را به آن منتقل کنید forRoot
روشی که با مسیرها انجام دادیم
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(greetingMiddleware).forRoutes(AppController);
}
}
میان افزارهای متعدد
همچنین ممکن است بخواهید چندین میان افزار را که به صورت متوالی اجرا می شوند ارسال کنید، برای داشتن آن ها باید آنها را با کاما از هم جدا کنید. apply
روش، مثال داده شده در زیر آمده است
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(first(),second()).forRoutes(AppController);
}
}
نتیجه
توابع میانافزار مفاهیم بسیار مهمی هستند که توسعهدهندگان بکاند باید آنها را بدانند و به درستی درک کنند، شما در هر نوع برنامهای که باید بسازید به آنها نیاز خواهید داشت، از مجوز گرفته تا آپلود فایلها و خلاصهتر از آن، فهرست بیپایان است. ..
ممنون که خواندید و فراموش نکنید که اگر این مطالب را مفید یافتید دنبال کنید