[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fother":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fother":1170,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fother":1191},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":13,"pinned":14,"draft":14,"body":15,"seo":1166,"stem":1167,"id":1168,"extension":1169},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fother","其他配置","","技能小册",[12],"nestjs","2022-05-23",false,{"type":16,"value":17,"toc":1150},"minimark",[18,21,43,51,55,63,68,95,99,106,347,350,471,614,617,620,627,630,633,647,650,669,770,773,780,785,788,808,811,906,909,1081,1084,1087,1146],[19,20,8],"h1",{"id":8},[22,23,24],"blockquote",{},[25,26,27,31,32,37,38,42],"p",{},[28,29,30],"strong",{},"归档","：请优先阅读 ",[33,34,36],"a",{"href":35},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs","NestJS 导读"," 与 ",[33,39,41],{"href":40},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fnew\u002Fbase","new\u002F 主线","。",[25,44,45,46,50],{},"当然还有很多",[47,48,49],"code",{},"nest","的配置，队列，任务调度，缓存，验证等，这里只介绍最常用的。",[52,53,54],"h2",{"id":54},"验证",[25,56,57],{},[33,58,62],{"href":59,"rel":60},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fvalidation#using-the-built-in-validationpipe",[61],"nofollow","文档",[25,64,65],{},[28,66,67],{},"举个例子来说，后端添加用户功能，肯定有很多字段是必填的，那不能每个字段都去校验吧，那么这一功能的判断就很多很多了，并且后面维护起来相当麻烦， 为了解决这一麻烦那么刚好可以使用内置的校验",[69,70,74],"pre",{"className":71,"code":72,"language":73,"meta":9,"style":9},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","pnpm add  class-validator class-transformer\n","shell",[47,75,76],{"__ignoreMap":9},[77,78,81,85,89,92],"span",{"class":79,"line":80},"line",1,[77,82,84],{"class":83},"sbgvK","pnpm",[77,86,88],{"class":87},"s_sjI"," add",[77,90,91],{"class":87},"  class-validator",[77,93,94],{"class":87}," class-transformer\n",[96,97,98],"h3",{"id":98},"注册",[25,100,101,102,105],{},"在 ",[47,103,104],{},"app.module.ts","中:",[69,107,111],{"className":108,"code":109,"language":110,"meta":9,"style":9},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","import { Module, ValidationPipe } from \"@nestjs\u002Fcommon\";\nimport { APP_PIPE } from \"@nestjs\u002Fcore\";\n\n@Module({\n  providers: [\n    {\n      provide: APP_PIPE,\n      useValue: new ValidationPipe({\n        transform: true, \u002F\u002F 自动将请求体转换为 DTO 类型\n        whitelist: true, \u002F\u002F 去掉 DTO 未声明的字段\n        forbidNonWhitelisted: true, \u002F\u002F 出现未知字段时返回 400\n      }),\n    },\n  ],\n})\nexport class AppModule {}\n","ts",[47,112,113,152,175,182,198,211,217,231,249,267,282,297,308,314,322,331],{"__ignoreMap":9},[77,114,115,119,123,127,130,133,136,139,143,146,149],{"class":79,"line":80},[77,116,118],{"class":117},"sVHd0","import",[77,120,122],{"class":121},"sP7_E"," {",[77,124,126],{"class":125},"su5hD"," Module",[77,128,129],{"class":121},",",[77,131,132],{"class":125}," ValidationPipe",[77,134,135],{"class":121}," }",[77,137,138],{"class":117}," from",[77,140,142],{"class":141},"sjJ54"," \"",[77,144,145],{"class":87},"@nestjs\u002Fcommon",[77,147,148],{"class":141},"\"",[77,150,151],{"class":121},";\n",[77,153,155,157,159,162,164,166,168,171,173],{"class":79,"line":154},2,[77,156,118],{"class":117},[77,158,122],{"class":121},[77,160,161],{"class":125}," APP_PIPE",[77,163,135],{"class":121},[77,165,138],{"class":117},[77,167,142],{"class":141},[77,169,170],{"class":87},"@nestjs\u002Fcore",[77,172,148],{"class":141},[77,174,151],{"class":121},[77,176,178],{"class":79,"line":177},3,[77,179,181],{"emptyLinePlaceholder":180},true,"\n",[77,183,185,188,192,195],{"class":79,"line":184},4,[77,186,187],{"class":121},"@",[77,189,191],{"class":190},"sGLFI","Module",[77,193,194],{"class":125},"(",[77,196,197],{"class":121},"{\n",[77,199,201,205,208],{"class":79,"line":200},5,[77,202,204],{"class":203},"skxfh","  providers",[77,206,207],{"class":121},":",[77,209,210],{"class":125}," [\n",[77,212,214],{"class":79,"line":213},6,[77,215,216],{"class":121},"    {\n",[77,218,220,223,225,228],{"class":79,"line":219},7,[77,221,222],{"class":203},"      provide",[77,224,207],{"class":121},[77,226,161],{"class":227},"s_hVV",[77,229,230],{"class":121},",\n",[77,232,234,237,239,243,245,247],{"class":79,"line":233},8,[77,235,236],{"class":203},"      useValue",[77,238,207],{"class":121},[77,240,242],{"class":241},"smGrS"," new",[77,244,132],{"class":190},[77,246,194],{"class":125},[77,248,197],{"class":121},[77,250,252,255,257,261,263],{"class":79,"line":251},9,[77,253,254],{"class":203},"        transform",[77,256,207],{"class":121},[77,258,260],{"class":259},"syTEX"," true",[77,262,129],{"class":121},[77,264,266],{"class":265},"sutJx"," \u002F\u002F 自动将请求体转换为 DTO 类型\n",[77,268,270,273,275,277,279],{"class":79,"line":269},10,[77,271,272],{"class":203},"        whitelist",[77,274,207],{"class":121},[77,276,260],{"class":259},[77,278,129],{"class":121},[77,280,281],{"class":265}," \u002F\u002F 去掉 DTO 未声明的字段\n",[77,283,285,288,290,292,294],{"class":79,"line":284},11,[77,286,287],{"class":203},"        forbidNonWhitelisted",[77,289,207],{"class":121},[77,291,260],{"class":259},[77,293,129],{"class":121},[77,295,296],{"class":265}," \u002F\u002F 出现未知字段时返回 400\n",[77,298,300,303,306],{"class":79,"line":299},12,[77,301,302],{"class":121},"      }",[77,304,305],{"class":125},")",[77,307,230],{"class":121},[77,309,311],{"class":79,"line":310},13,[77,312,313],{"class":121},"    },\n",[77,315,317,320],{"class":79,"line":316},14,[77,318,319],{"class":125},"  ]",[77,321,230],{"class":121},[77,323,325,328],{"class":79,"line":324},15,[77,326,327],{"class":121},"}",[77,329,330],{"class":125},")\n",[77,332,334,337,341,344],{"class":79,"line":333},16,[77,335,336],{"class":117},"export",[77,338,340],{"class":339},"sbsja"," class",[77,342,343],{"class":83}," AppModule",[77,345,346],{"class":121}," {}\n",[96,348,349],{"id":349},"使用",[69,351,353],{"className":108,"code":352,"language":110,"meta":9,"style":9},"import { IsEmail, IsNotEmpty } from \"class-validator\";\n\nexport class CreateUserDto {\n  @IsEmail()\n  email: string;\n\n  @IsNotEmpty({ message: \"密码不能为空\" })\n  password: string;\n}\n",[47,354,355,382,386,398,409,423,427,455,466],{"__ignoreMap":9},[77,356,357,359,361,364,366,369,371,373,375,378,380],{"class":79,"line":80},[77,358,118],{"class":117},[77,360,122],{"class":121},[77,362,363],{"class":125}," IsEmail",[77,365,129],{"class":121},[77,367,368],{"class":125}," IsNotEmpty",[77,370,135],{"class":121},[77,372,138],{"class":117},[77,374,142],{"class":141},[77,376,377],{"class":87},"class-validator",[77,379,148],{"class":141},[77,381,151],{"class":121},[77,383,384],{"class":79,"line":154},[77,385,181],{"emptyLinePlaceholder":180},[77,387,388,390,392,395],{"class":79,"line":177},[77,389,336],{"class":117},[77,391,340],{"class":339},[77,393,394],{"class":83}," CreateUserDto",[77,396,397],{"class":121}," {\n",[77,399,400,403,406],{"class":79,"line":184},[77,401,402],{"class":121},"  @",[77,404,405],{"class":190},"IsEmail",[77,407,408],{"class":125},"()\n",[77,410,411,415,417,421],{"class":79,"line":200},[77,412,414],{"class":413},"sucvu","  email",[77,416,207],{"class":241},[77,418,420],{"class":419},"sZMiF"," string",[77,422,151],{"class":121},[77,424,425],{"class":79,"line":213},[77,426,181],{"emptyLinePlaceholder":180},[77,428,429,431,434,436,439,442,444,446,449,451,453],{"class":79,"line":219},[77,430,402],{"class":121},[77,432,433],{"class":190},"IsNotEmpty",[77,435,194],{"class":125},[77,437,438],{"class":121},"{",[77,440,441],{"class":203}," message",[77,443,207],{"class":121},[77,445,142],{"class":141},[77,447,448],{"class":87},"密码不能为空",[77,450,148],{"class":141},[77,452,135],{"class":121},[77,454,330],{"class":125},[77,456,457,460,462,464],{"class":79,"line":233},[77,458,459],{"class":413},"  password",[77,461,207],{"class":241},[77,463,420],{"class":419},[77,465,151],{"class":121},[77,467,468],{"class":79,"line":251},[77,469,470],{"class":121},"}\n",[69,472,474],{"className":108,"code":473,"language":110,"meta":9,"style":9},"import { Body } from \"@nestjs\u002Fcommon\";\n@Controller()\nexport class AppController {\n  constructor(private readonly appService: AppService) {}\n\n  @Post(\"\u002Fcreate\")\n  create(@Body() user: CreateUserDto) {\n    return \"success\";\n  }\n}\n",[47,475,476,497,506,517,543,547,565,591,605,610],{"__ignoreMap":9},[77,477,478,480,482,485,487,489,491,493,495],{"class":79,"line":80},[77,479,118],{"class":117},[77,481,122],{"class":121},[77,483,484],{"class":125}," Body",[77,486,135],{"class":121},[77,488,138],{"class":117},[77,490,142],{"class":141},[77,492,145],{"class":87},[77,494,148],{"class":141},[77,496,151],{"class":121},[77,498,499,501,504],{"class":79,"line":154},[77,500,187],{"class":121},[77,502,503],{"class":190},"Controller",[77,505,408],{"class":125},[77,507,508,510,512,515],{"class":79,"line":177},[77,509,336],{"class":117},[77,511,340],{"class":339},[77,513,514],{"class":83}," AppController",[77,516,397],{"class":121},[77,518,519,522,524,527,530,534,536,539,541],{"class":79,"line":184},[77,520,521],{"class":339},"  constructor",[77,523,194],{"class":121},[77,525,526],{"class":339},"private",[77,528,529],{"class":339}," readonly",[77,531,533],{"class":532},"s99_P"," appService",[77,535,207],{"class":241},[77,537,538],{"class":83}," AppService",[77,540,305],{"class":121},[77,542,346],{"class":121},[77,544,545],{"class":79,"line":200},[77,546,181],{"emptyLinePlaceholder":180},[77,548,549,551,554,556,558,561,563],{"class":79,"line":213},[77,550,402],{"class":121},[77,552,553],{"class":190},"Post",[77,555,194],{"class":125},[77,557,148],{"class":141},[77,559,560],{"class":87},"\u002Fcreate",[77,562,148],{"class":141},[77,564,330],{"class":125},[77,566,567,571,574,577,580,583,585,587,589],{"class":79,"line":219},[77,568,570],{"class":569},"sVXei","  create",[77,572,573],{"class":121},"(@",[77,575,576],{"class":190},"Body",[77,578,579],{"class":125},"() ",[77,581,582],{"class":532},"user",[77,584,207],{"class":241},[77,586,394],{"class":83},[77,588,305],{"class":121},[77,590,397],{"class":121},[77,592,593,596,598,601,603],{"class":79,"line":233},[77,594,595],{"class":117},"    return",[77,597,142],{"class":141},[77,599,600],{"class":87},"success",[77,602,148],{"class":141},[77,604,151],{"class":121},[77,606,607],{"class":79,"line":251},[77,608,609],{"class":121},"  }\n",[77,611,612],{"class":79,"line":269},[77,613,470],{"class":121},[25,615,616],{},"这样就避免了大量的判断了；",[52,618,619],{"id":619},"速率限制",[25,621,622],{},[33,623,626],{"href":624,"rel":625},"https:\u002F\u002Fdocs.nestjs.com\u002Fsecurity\u002Frate-limiting",[61],"官方文档 · Rate limiting",[25,628,629],{},"保护应用免受暴力攻击的常用技术是限速。首先，你需要安装 @nestjs\u002Fthrottler 包。",[96,631,632],{"id":632},"安装",[69,634,636],{"className":71,"code":635,"language":73,"meta":9,"style":9},"pnpm add @nestjs\u002Fthrottler\n",[47,637,638],{"__ignoreMap":9},[77,639,640,642,644],{"class":79,"line":80},[77,641,84],{"class":83},[77,643,88],{"class":87},[77,645,646],{"class":87}," @nestjs\u002Fthrottler\n",[96,648,349],{"id":649},"使用-1",[25,651,652,653,656,657,660,661,664,665,668],{},"安装完成后，可以使用 ",[47,654,655],{},"forRoot"," 或 ",[47,658,659],{},"forRootAsync"," 方法将 ",[47,662,663],{},"ThrottlerModule"," 配置为任何其他 ",[47,666,667],{},"Nest"," 包。",[69,670,672],{"className":108,"code":671,"language":110,"meta":9,"style":9},"@Module({\n  imports: [\n    ThrottlerModule.forRoot([\n      {\n        ttl: 60000,\n        limit: 10,\n      },\n    ]),\n  ],\n})\nexport class AppModule {}\n",[47,673,674,684,693,706,711,724,736,741,748,754,760],{"__ignoreMap":9},[77,675,676,678,680,682],{"class":79,"line":80},[77,677,187],{"class":121},[77,679,191],{"class":190},[77,681,194],{"class":125},[77,683,197],{"class":121},[77,685,686,689,691],{"class":79,"line":154},[77,687,688],{"class":203},"  imports",[77,690,207],{"class":121},[77,692,210],{"class":125},[77,694,695,698,701,703],{"class":79,"line":177},[77,696,697],{"class":125},"    ThrottlerModule",[77,699,700],{"class":121},".",[77,702,655],{"class":190},[77,704,705],{"class":125},"([\n",[77,707,708],{"class":79,"line":184},[77,709,710],{"class":121},"      {\n",[77,712,713,716,718,722],{"class":79,"line":200},[77,714,715],{"class":203},"        ttl",[77,717,207],{"class":121},[77,719,721],{"class":720},"srdBf"," 60000",[77,723,230],{"class":121},[77,725,726,729,731,734],{"class":79,"line":213},[77,727,728],{"class":203},"        limit",[77,730,207],{"class":121},[77,732,733],{"class":720}," 10",[77,735,230],{"class":121},[77,737,738],{"class":79,"line":219},[77,739,740],{"class":121},"      },\n",[77,742,743,746],{"class":79,"line":233},[77,744,745],{"class":125},"    ])",[77,747,230],{"class":121},[77,749,750,752],{"class":79,"line":251},[77,751,319],{"class":125},[77,753,230],{"class":121},[77,755,756,758],{"class":79,"line":269},[77,757,327],{"class":121},[77,759,330],{"class":125},[77,761,762,764,766,768],{"class":79,"line":284},[77,763,336],{"class":117},[77,765,340],{"class":339},[77,767,343],{"class":83},[77,769,346],{"class":121},[52,771,772],{"id":772},"任务调度",[25,774,775],{},[33,776,779],{"href":777,"rel":778},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Ftask-scheduling",[61],"官方文档 · Task scheduling",[22,781,782],{},[25,783,784],{},"任务调度允许你安排任意代码（方法\u002F函数）在固定日期\u002F时间、重复间隔或在指定间隔后执行一次",[96,786,632],{"id":787},"安装-1",[69,789,791],{"className":108,"code":790,"language":110,"meta":9,"style":9},"pnpm add @nestjs\u002Fschedule\n",[47,792,793],{"__ignoreMap":9},[77,794,795,798,800,802,805],{"class":79,"line":80},[77,796,797],{"class":125},"pnpm add ",[77,799,187],{"class":121},[77,801,12],{"class":125},[77,803,804],{"class":241},"\u002F",[77,806,807],{"class":125},"schedule\n",[96,809,349],{"id":810},"使用-2",[69,812,814],{"className":108,"code":813,"language":110,"meta":9,"style":9},"import { Module } from \"@nestjs\u002Fcommon\";\nimport { ScheduleModule } from \"@nestjs\u002Fschedule\";\n\n@Module({\n  imports: [ScheduleModule.forRoot()],\n})\nexport class AppModule {}\n",[47,815,816,836,858,862,872,890,896],{"__ignoreMap":9},[77,817,818,820,822,824,826,828,830,832,834],{"class":79,"line":80},[77,819,118],{"class":117},[77,821,122],{"class":121},[77,823,126],{"class":125},[77,825,135],{"class":121},[77,827,138],{"class":117},[77,829,142],{"class":141},[77,831,145],{"class":87},[77,833,148],{"class":141},[77,835,151],{"class":121},[77,837,838,840,842,845,847,849,851,854,856],{"class":79,"line":154},[77,839,118],{"class":117},[77,841,122],{"class":121},[77,843,844],{"class":125}," ScheduleModule",[77,846,135],{"class":121},[77,848,138],{"class":117},[77,850,142],{"class":141},[77,852,853],{"class":87},"@nestjs\u002Fschedule",[77,855,148],{"class":141},[77,857,151],{"class":121},[77,859,860],{"class":79,"line":177},[77,861,181],{"emptyLinePlaceholder":180},[77,863,864,866,868,870],{"class":79,"line":184},[77,865,187],{"class":121},[77,867,191],{"class":190},[77,869,194],{"class":125},[77,871,197],{"class":121},[77,873,874,876,878,881,883,885,888],{"class":79,"line":200},[77,875,688],{"class":203},[77,877,207],{"class":121},[77,879,880],{"class":125}," [ScheduleModule",[77,882,700],{"class":121},[77,884,655],{"class":190},[77,886,887],{"class":125},"()]",[77,889,230],{"class":121},[77,891,892,894],{"class":79,"line":213},[77,893,327],{"class":121},[77,895,330],{"class":125},[77,897,898,900,902,904],{"class":79,"line":219},[77,899,336],{"class":117},[77,901,340],{"class":339},[77,903,343],{"class":83},[77,905,346],{"class":121},[96,907,908],{"id":908},"定时任务",[69,910,912],{"className":108,"code":911,"language":110,"meta":9,"style":9},"import { Injectable, Logger } from \"@nestjs\u002Fcommon\";\nimport { Cron } from \"@nestjs\u002Fschedule\";\n\n@Injectable()\nexport class TasksService {\n  private readonly logger = new Logger(TasksService.name);\n\n  @Cron(\"45 * * * * *\")\n  handleCron() {\n    this.logger.debug(\"Called when the current second is 45\");\n  }\n}\n",[47,913,914,940,961,965,974,985,1012,1016,1034,1044,1073,1077],{"__ignoreMap":9},[77,915,916,918,920,923,925,928,930,932,934,936,938],{"class":79,"line":80},[77,917,118],{"class":117},[77,919,122],{"class":121},[77,921,922],{"class":125}," Injectable",[77,924,129],{"class":121},[77,926,927],{"class":125}," Logger",[77,929,135],{"class":121},[77,931,138],{"class":117},[77,933,142],{"class":141},[77,935,145],{"class":87},[77,937,148],{"class":141},[77,939,151],{"class":121},[77,941,942,944,946,949,951,953,955,957,959],{"class":79,"line":154},[77,943,118],{"class":117},[77,945,122],{"class":121},[77,947,948],{"class":125}," Cron",[77,950,135],{"class":121},[77,952,138],{"class":117},[77,954,142],{"class":141},[77,956,853],{"class":87},[77,958,148],{"class":141},[77,960,151],{"class":121},[77,962,963],{"class":79,"line":177},[77,964,181],{"emptyLinePlaceholder":180},[77,966,967,969,972],{"class":79,"line":184},[77,968,187],{"class":121},[77,970,971],{"class":190},"Injectable",[77,973,408],{"class":125},[77,975,976,978,980,983],{"class":79,"line":200},[77,977,336],{"class":117},[77,979,340],{"class":339},[77,981,982],{"class":83}," TasksService",[77,984,397],{"class":121},[77,986,987,990,992,995,998,1000,1002,1005,1007,1010],{"class":79,"line":213},[77,988,989],{"class":339},"  private",[77,991,529],{"class":339},[77,993,994],{"class":413}," logger",[77,996,997],{"class":241}," =",[77,999,242],{"class":241},[77,1001,927],{"class":569},[77,1003,1004],{"class":125},"(TasksService",[77,1006,700],{"class":121},[77,1008,1009],{"class":125},"name)",[77,1011,151],{"class":121},[77,1013,1014],{"class":79,"line":219},[77,1015,181],{"emptyLinePlaceholder":180},[77,1017,1018,1020,1023,1025,1027,1030,1032],{"class":79,"line":233},[77,1019,402],{"class":121},[77,1021,1022],{"class":190},"Cron",[77,1024,194],{"class":125},[77,1026,148],{"class":141},[77,1028,1029],{"class":87},"45 * * * * *",[77,1031,148],{"class":141},[77,1033,330],{"class":125},[77,1035,1036,1039,1042],{"class":79,"line":251},[77,1037,1038],{"class":569},"  handleCron",[77,1040,1041],{"class":121},"()",[77,1043,397],{"class":121},[77,1045,1046,1050,1052,1055,1057,1060,1062,1064,1067,1069,1071],{"class":79,"line":269},[77,1047,1049],{"class":1048},"s39Yj","    this",[77,1051,700],{"class":121},[77,1053,1054],{"class":125},"logger",[77,1056,700],{"class":121},[77,1058,1059],{"class":190},"debug",[77,1061,194],{"class":203},[77,1063,148],{"class":141},[77,1065,1066],{"class":87},"Called when the current second is 45",[77,1068,148],{"class":141},[77,1070,305],{"class":203},[77,1072,151],{"class":121},[77,1074,1075],{"class":79,"line":284},[77,1076,609],{"class":121},[77,1078,1079],{"class":79,"line":299},[77,1080,470],{"class":121},[52,1082,1083],{"id":1083},"参考文献",[25,1085,1086],{},"以下链接在编写时均可正常访问：",[1088,1089,1090,1103],"table",{},[1091,1092,1093],"thead",{},[1094,1095,1096,1100],"tr",{},[1097,1098,1099],"th",{},"资料",[1097,1101,1102],{},"说明",[1104,1105,1106,1121,1134],"tbody",{},[1094,1107,1108,1116],{},[1109,1110,1111],"td",{},[33,1112,1115],{"href":1113,"rel":1114},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fvalidation",[61],"Validation",[1109,1117,1118],{},[47,1119,1120],{},"ValidationPipe",[1094,1122,1123,1129],{},[1109,1124,1125],{},[33,1126,1128],{"href":624,"rel":1127},[61],"Rate limiting",[1109,1130,1131],{},[47,1132,1133],{},"@nestjs\u002Fthrottler",[1094,1135,1136,1142],{},[1109,1137,1138],{},[33,1139,1141],{"href":777,"rel":1140},[61],"Task scheduling",[1109,1143,1144],{},[47,1145,853],{},[1147,1148,1149],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":9,"searchDepth":154,"depth":154,"links":1151},[1152,1156,1160,1165],{"id":54,"depth":154,"text":54,"children":1153},[1154,1155],{"id":98,"depth":177,"text":98},{"id":349,"depth":177,"text":349},{"id":619,"depth":154,"text":619,"children":1157},[1158,1159],{"id":632,"depth":177,"text":632},{"id":649,"depth":177,"text":349},{"id":772,"depth":154,"text":772,"children":1161},[1162,1163,1164],{"id":787,"depth":177,"text":632},{"id":810,"depth":177,"text":349},{"id":908,"depth":177,"text":908},{"id":1083,"depth":154,"text":1083},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FNestJS\u002Fbefore\u002Fother","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FNestJS\u002Fbefore\u002Fother.md","md",{"items":1171},[1172,1175,1178,1181,1185,1188],{"path":1173,"title":1174,"description":9,"category":10,"score":213},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce","异常处理器",{"path":1176,"title":1177,"description":9,"category":10,"score":213},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fenv","环境加载",{"path":1179,"title":1180,"description":9,"category":10,"score":213},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdatabase","数据库的配置",{"path":1182,"title":1183,"description":1184,"category":10,"score":213},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Finfo","归档说明（before\u002F）","本目录（before\u002F）为早期 NestJS 实战笔记：以完整业务片段（守卫、拦截器、MongoDB、JWT 等）为主，写法与文件命名不统一。新项目请跟 new\u002F 主线，技术细节以 docs.nestjs.com 为准。",{"path":1186,"title":1187,"description":9,"category":10,"score":213},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fitc","统一响应格式拦截器",{"path":1189,"title":1190,"description":9,"category":10,"score":213},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fnext","路由守卫",{"series":1192,"title":1193,"items":1194,"index":269,"prev":1224,"next":1225},"booklet\u002Fend\u002Fnestjs\u002Fbefore","before",[1195,1197,1201,1203,1205,1207,1211,1213,1217,1221,1223],{"path":1179,"title":1180,"date":1196,"pinned":14},"2024-06-22",{"path":1198,"title":1199,"date":1200,"pinned":14},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdemo","入手Demo","2022-10-15",{"path":1176,"title":1177,"date":1202,"pinned":14},"2024-09-01",{"path":1173,"title":1174,"date":1204,"pinned":14},"2026-03-17",{"path":1182,"title":1183,"date":1206,"pinned":14},"2023-08-31",{"path":1208,"title":1209,"date":1210,"pinned":14},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Finjectable","操作日志拦截器","2020-02-20",{"path":1186,"title":1187,"date":1212,"pinned":14},"2023-08-17",{"path":1214,"title":1215,"date":1216,"pinned":14},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fjwt","JWT 与 Passport 授权","2021-08-10",{"path":1218,"title":1219,"date":1220,"pinned":14},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fmi","Nest 中间件","2022-06-21",{"path":1189,"title":1190,"date":1222,"pinned":14},"2022-12-01",{"path":7,"title":8,"date":13,"pinned":14},{"path":1189,"title":1190,"date":1222,"pinned":14},null]