[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fnext":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fnext":3989,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fnext":4010},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":3985,"stem":3986,"id":3987,"extension":3988},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fnext","路由守卫","","技能小册",[12,13],"nestjs","next","2022-12-01",false,{"type":17,"value":18,"toc":3963},"minimark",[19,22,49,60,71,82,87,91,95,98,351,354,562,565,1426,1429,1435,1518,1521,1721,1724,1727,1780,2104,2107,2825,2828,2832,2908,2911,3080,3083,3086,3166,3169,3639,3642,3646,3722,3725,3874,3877,3902,3905,3959],[20,21,8],"h1",{"id":8},[23,24,25],"blockquote",{},[26,27,28,32,33,37,38,43,44,48],"p",{},[29,30,31],"strong",{},"归档","：文件名 ",[34,35,36],"code",{},"next.md"," 为历史命名，内容与 Next.js 无关。请优先阅读 ",[39,40,42],"a",{"href":41},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fnew\u002Fguards","new\u002Fguards"," 与 ",[39,45,47],{"href":46},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fnew\u002Fauth","new\u002Fauth","。",[26,50,51,52,55,56,59],{},"守卫是一个用 ",[34,53,54],{},"@Injectable()"," 装饰器注释的类，它实现了 ",[34,57,58],{},"CanActivate"," 接口。",[26,61,62,63,66,67,70],{},"守卫有单一的责任。它们根据运行时存在的某些条件（如权限、角色、ACL 等）确定给定请求是否将由路由处理程序处理。这通常称为授权。授权（及其通常与之合作的身份验证）通常由传统 ",[34,64,65],{},"Express"," 应用中的 中间件 处理。中间件是身份验证的不错选择，因为诸如令牌验证和将属性附加到 ",[34,68,69],{},"request"," 对象之类的事情与特定路由上下文（及其元数据）没有紧密联系。",[26,72,73,74,77,78,81],{},"但是中间件，就其本质而言，是愚蠢的。它不知道调用 ",[34,75,76],{},"next()"," 函数后将执行哪个处理程序。另一方面，Guards 可以访问 ",[34,79,80],{},"ExecutionContext"," 实例，因此确切地知道接下来要执行什么。它们的设计与异常过滤器、管道和拦截器非常相似，可让你在请求\u002F响应周期的正确位置插入处理逻辑，并以声明方式进行。这有助于使你的代码保持干爽和声明式。",[26,83,84],{},[29,85,86],{},"为了让程序更加智能，这里使用装饰器功能，例如在某一个请求接口上添加一个装饰器，限制重复请求等等， 接下来以俩个案例：",[88,89,90],"h2",{"id":90},"重复请求限制",[92,93,94],"h3",{"id":94},"常量文件",[26,96,97],{},"为什么要使用常量文件？好处就是统一管理；首先创建文件作为常量：",[99,100,104],"pre",{"className":101,"code":102,"language":103,"meta":9,"style":9},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F 记录日志的key\nexport const LOG_KEY_METADATA = \"__log__\";\n\u002F\u002F 重复提交的key\nexport const REPEAT_SUBMIT_KEY_METADATA = \"__repeat_submit__\";\n\u002F\u002F public: 不需要token校验\nexport const PUBLIC_KEY_METADATA = \"__public__\";\n\u002F\u002F 权限的key\nexport const PERMISSION_KEY_METADATA = \"__permission__\";\n\n\u002F\u002F ===== Redis缓存\n\u002F\u002F Redis 重复提交的key, 目录的形式， 例如： __redis_repeat__:\u002Fapi\u002Fuser\u002Flist\nexport const REDIS_REPEAT_SUBMIT_KEY = \"__redis_repeat__:\";\n\u002F\u002F 存储验证码图片\nexport const REDIS_CAPTCHA_KEY = \"__captcha__:\";\n\u002F\u002F 存储用户的token或者userId\nexport const REDIS_TOKEN_KEY = \"__token__:\";\n\u002F\u002F 存储用户的信息\nexport const REDIS_USER_INFO_KEY = \"__user_info__:\";\n","ts",[34,105,106,115,149,155,176,182,203,209,230,237,243,249,270,276,297,303,324,330],{"__ignoreMap":9},[107,108,111],"span",{"class":109,"line":110},"line",1,[107,112,114],{"class":113},"sutJx","\u002F\u002F 记录日志的key\n",[107,116,118,122,126,130,134,138,142,145],{"class":109,"line":117},2,[107,119,121],{"class":120},"sVHd0","export",[107,123,125],{"class":124},"sbsja"," const",[107,127,129],{"class":128},"s_hVV"," LOG_KEY_METADATA",[107,131,133],{"class":132},"smGrS"," =",[107,135,137],{"class":136},"sjJ54"," \"",[107,139,141],{"class":140},"s_sjI","__log__",[107,143,144],{"class":136},"\"",[107,146,148],{"class":147},"sP7_E",";\n",[107,150,152],{"class":109,"line":151},3,[107,153,154],{"class":113},"\u002F\u002F 重复提交的key\n",[107,156,158,160,162,165,167,169,172,174],{"class":109,"line":157},4,[107,159,121],{"class":120},[107,161,125],{"class":124},[107,163,164],{"class":128}," REPEAT_SUBMIT_KEY_METADATA",[107,166,133],{"class":132},[107,168,137],{"class":136},[107,170,171],{"class":140},"__repeat_submit__",[107,173,144],{"class":136},[107,175,148],{"class":147},[107,177,179],{"class":109,"line":178},5,[107,180,181],{"class":113},"\u002F\u002F public: 不需要token校验\n",[107,183,185,187,189,192,194,196,199,201],{"class":109,"line":184},6,[107,186,121],{"class":120},[107,188,125],{"class":124},[107,190,191],{"class":128}," PUBLIC_KEY_METADATA",[107,193,133],{"class":132},[107,195,137],{"class":136},[107,197,198],{"class":140},"__public__",[107,200,144],{"class":136},[107,202,148],{"class":147},[107,204,206],{"class":109,"line":205},7,[107,207,208],{"class":113},"\u002F\u002F 权限的key\n",[107,210,212,214,216,219,221,223,226,228],{"class":109,"line":211},8,[107,213,121],{"class":120},[107,215,125],{"class":124},[107,217,218],{"class":128}," PERMISSION_KEY_METADATA",[107,220,133],{"class":132},[107,222,137],{"class":136},[107,224,225],{"class":140},"__permission__",[107,227,144],{"class":136},[107,229,148],{"class":147},[107,231,233],{"class":109,"line":232},9,[107,234,236],{"emptyLinePlaceholder":235},true,"\n",[107,238,240],{"class":109,"line":239},10,[107,241,242],{"class":113},"\u002F\u002F ===== Redis缓存\n",[107,244,246],{"class":109,"line":245},11,[107,247,248],{"class":113},"\u002F\u002F Redis 重复提交的key, 目录的形式， 例如： __redis_repeat__:\u002Fapi\u002Fuser\u002Flist\n",[107,250,252,254,256,259,261,263,266,268],{"class":109,"line":251},12,[107,253,121],{"class":120},[107,255,125],{"class":124},[107,257,258],{"class":128}," REDIS_REPEAT_SUBMIT_KEY",[107,260,133],{"class":132},[107,262,137],{"class":136},[107,264,265],{"class":140},"__redis_repeat__:",[107,267,144],{"class":136},[107,269,148],{"class":147},[107,271,273],{"class":109,"line":272},13,[107,274,275],{"class":113},"\u002F\u002F 存储验证码图片\n",[107,277,279,281,283,286,288,290,293,295],{"class":109,"line":278},14,[107,280,121],{"class":120},[107,282,125],{"class":124},[107,284,285],{"class":128}," REDIS_CAPTCHA_KEY",[107,287,133],{"class":132},[107,289,137],{"class":136},[107,291,292],{"class":140},"__captcha__:",[107,294,144],{"class":136},[107,296,148],{"class":147},[107,298,300],{"class":109,"line":299},15,[107,301,302],{"class":113},"\u002F\u002F 存储用户的token或者userId\n",[107,304,306,308,310,313,315,317,320,322],{"class":109,"line":305},16,[107,307,121],{"class":120},[107,309,125],{"class":124},[107,311,312],{"class":128}," REDIS_TOKEN_KEY",[107,314,133],{"class":132},[107,316,137],{"class":136},[107,318,319],{"class":140},"__token__:",[107,321,144],{"class":136},[107,323,148],{"class":147},[107,325,327],{"class":109,"line":326},17,[107,328,329],{"class":113},"\u002F\u002F 存储用户的信息\n",[107,331,333,335,337,340,342,344,347,349],{"class":109,"line":332},18,[107,334,121],{"class":120},[107,336,125],{"class":124},[107,338,339],{"class":128}," REDIS_USER_INFO_KEY",[107,341,133],{"class":132},[107,343,137],{"class":136},[107,345,346],{"class":140},"__user_info__:",[107,348,144],{"class":136},[107,350,148],{"class":147},[92,352,353],{"id":353},"自定义元数据",[99,355,357],{"className":101,"code":356,"language":103,"meta":9,"style":9},"import { SetMetadata } from \"@nestjs\u002Fcommon\";\nimport { REPEAT_SUBMIT_KEY_METADATA } from \"..\u002Fconstants\u002Fmetadata.constant\";\n\nexport class RepeatSubmitOption {\n  interval?: number = 1; \u002F\u002F默认1s\n  message?: string = \"操作过于频繁\"; \u002F\u002F 可以自定义\n}\nexport const RepeatSubmit = (option?: RepeatSubmitOption) => {\n  return SetMetadata(REPEAT_SUBMIT_KEY_METADATA, Object.assign(new RepeatSubmitOption(), option));\n};\n",[34,358,359,386,407,411,425,450,474,479,510,557],{"__ignoreMap":9},[107,360,361,364,367,371,374,377,379,382,384],{"class":109,"line":110},[107,362,363],{"class":120},"import",[107,365,366],{"class":147}," {",[107,368,370],{"class":369},"su5hD"," SetMetadata",[107,372,373],{"class":147}," }",[107,375,376],{"class":120}," from",[107,378,137],{"class":136},[107,380,381],{"class":140},"@nestjs\u002Fcommon",[107,383,144],{"class":136},[107,385,148],{"class":147},[107,387,388,390,392,394,396,398,400,403,405],{"class":109,"line":117},[107,389,363],{"class":120},[107,391,366],{"class":147},[107,393,164],{"class":369},[107,395,373],{"class":147},[107,397,376],{"class":120},[107,399,137],{"class":136},[107,401,402],{"class":140},"..\u002Fconstants\u002Fmetadata.constant",[107,404,144],{"class":136},[107,406,148],{"class":147},[107,408,409],{"class":109,"line":151},[107,410,236],{"emptyLinePlaceholder":235},[107,412,413,415,418,422],{"class":109,"line":157},[107,414,121],{"class":120},[107,416,417],{"class":124}," class",[107,419,421],{"class":420},"sbgvK"," RepeatSubmitOption",[107,423,424],{"class":147}," {\n",[107,426,427,431,434,438,440,444,447],{"class":109,"line":178},[107,428,430],{"class":429},"sucvu","  interval",[107,432,433],{"class":132},"?:",[107,435,437],{"class":436},"sZMiF"," number",[107,439,133],{"class":132},[107,441,443],{"class":442},"srdBf"," 1",[107,445,446],{"class":147},";",[107,448,449],{"class":113}," \u002F\u002F默认1s\n",[107,451,452,455,457,460,462,464,467,469,471],{"class":109,"line":184},[107,453,454],{"class":429},"  message",[107,456,433],{"class":132},[107,458,459],{"class":436}," string",[107,461,133],{"class":132},[107,463,137],{"class":136},[107,465,466],{"class":140},"操作过于频繁",[107,468,144],{"class":136},[107,470,446],{"class":147},[107,472,473],{"class":113}," \u002F\u002F 可以自定义\n",[107,475,476],{"class":109,"line":205},[107,477,478],{"class":147},"}\n",[107,480,481,483,485,489,491,494,498,500,502,505,508],{"class":109,"line":211},[107,482,121],{"class":120},[107,484,125],{"class":124},[107,486,488],{"class":487},"sfCm-"," RepeatSubmit",[107,490,133],{"class":132},[107,492,493],{"class":147}," (",[107,495,497],{"class":496},"s99_P","option",[107,499,433],{"class":132},[107,501,421],{"class":420},[107,503,504],{"class":147},")",[107,506,507],{"class":124}," =>",[107,509,424],{"class":147},[107,511,512,515,518,522,525,528,531,534,537,539,542,544,547,549,552,555],{"class":109,"line":232},[107,513,514],{"class":120},"  return",[107,516,370],{"class":517},"sGLFI",[107,519,521],{"class":520},"skxfh","(",[107,523,524],{"class":128},"REPEAT_SUBMIT_KEY_METADATA",[107,526,527],{"class":147},",",[107,529,530],{"class":369}," Object",[107,532,533],{"class":147},".",[107,535,536],{"class":517},"assign",[107,538,521],{"class":520},[107,540,541],{"class":132},"new",[107,543,421],{"class":517},[107,545,546],{"class":520},"()",[107,548,527],{"class":147},[107,550,551],{"class":369}," option",[107,553,554],{"class":520},"))",[107,556,148],{"class":147},[107,558,559],{"class":109,"line":239},[107,560,561],{"class":147},"};\n",[92,563,564],{"id":564},"自定义守卫",[99,566,568],{"className":101,"code":567,"language":103,"meta":9,"style":9},"import { CanActivate, ExecutionContext, Injectable } from \"@nestjs\u002Fcommon\";\nimport { Reflector } from \"@nestjs\u002Fcore\";\nimport { RepeatSubmitOption } from \"..\u002Fdecorator\u002Frepeat-submit.decorator\";\nimport {\n  REDIS_REPEAT_SUBMIT_KEY,\n  REPEAT_SUBMIT_KEY_METADATA,\n} from \"..\u002Fconstants\u002Fmetadata.constant\";\nimport { ApiException } from \"..\u002Fexception\u002Fapi.exception\";\nimport { InjectRedis } from \"@nestjs-modules\u002Fioredis\";\nimport Redis from \"ioredis\";\nimport { Request } from \"express\";\nimport { CommonService } from \"src\u002Fshared\u002Fcommon\u002Fcommon.service\";\n\n@Injectable()\nexport class RepeatSubmitGuard implements CanActivate {\n  constructor(\n    private readonly reflector: Reflector,\n    @InjectRedis() private readonly redis: Redis,\n    private readonly commonService: CommonService,\n  ) {}\n  async canActivate(context: ExecutionContext): Promise\u003Cboolean> {\n    const repeatSubmitOption: RepeatSubmitOption = this.reflector.get(\n      REPEAT_SUBMIT_KEY_METADATA,\n      context.getHandler(),\n    );\n    if (!repeatSubmitOption) return true;\n    const request: Request = context.switchToHttp().getRequest();\n    const _key = `${REDIS_REPEAT_SUBMIT_KEY}${request.url}`;\n    const cache = await this.redis.get(_key);\n    const data = {\n      ip: this.commonService.getIp(request),\n      body: request.body,\n      prams: request.params,\n      query: request.query,\n    };\n    const dataStr = JSON.stringify(data);\n    if (!cache) {\n      if (dataStr) {\n        \u002F\u002F 以url作为key去做缓存，缓存时间设置为元信息传递的时间 默认时间1s\n        this.redis.set(_key, dataStr, \"EX\", repeatSubmitOption.interval);\n      }\n    } else {\n      if (dataStr && dataStr === cache) {\n        \u002F\u002F ApiException是什么可以查看 异常过滤器\n        throw new ApiException(repeatSubmitOption.message);\n      }\n    }\n    return true;\n  }\n}\n",[34,569,570,601,623,644,650,658,665,680,702,724,743,765,787,791,802,818,826,844,870,886,895,932,963,971,986,994,1020,1053,1084,1117,1129,1157,1174,1191,1208,1214,1241,1258,1273,1279,1324,1330,1341,1364,1370,1394,1399,1405,1415,1421],{"__ignoreMap":9},[107,571,572,574,576,579,581,584,586,589,591,593,595,597,599],{"class":109,"line":110},[107,573,363],{"class":120},[107,575,366],{"class":147},[107,577,578],{"class":369}," CanActivate",[107,580,527],{"class":147},[107,582,583],{"class":369}," ExecutionContext",[107,585,527],{"class":147},[107,587,588],{"class":369}," Injectable",[107,590,373],{"class":147},[107,592,376],{"class":120},[107,594,137],{"class":136},[107,596,381],{"class":140},[107,598,144],{"class":136},[107,600,148],{"class":147},[107,602,603,605,607,610,612,614,616,619,621],{"class":109,"line":117},[107,604,363],{"class":120},[107,606,366],{"class":147},[107,608,609],{"class":369}," Reflector",[107,611,373],{"class":147},[107,613,376],{"class":120},[107,615,137],{"class":136},[107,617,618],{"class":140},"@nestjs\u002Fcore",[107,620,144],{"class":136},[107,622,148],{"class":147},[107,624,625,627,629,631,633,635,637,640,642],{"class":109,"line":151},[107,626,363],{"class":120},[107,628,366],{"class":147},[107,630,421],{"class":369},[107,632,373],{"class":147},[107,634,376],{"class":120},[107,636,137],{"class":136},[107,638,639],{"class":140},"..\u002Fdecorator\u002Frepeat-submit.decorator",[107,641,144],{"class":136},[107,643,148],{"class":147},[107,645,646,648],{"class":109,"line":157},[107,647,363],{"class":120},[107,649,424],{"class":147},[107,651,652,655],{"class":109,"line":178},[107,653,654],{"class":369},"  REDIS_REPEAT_SUBMIT_KEY",[107,656,657],{"class":147},",\n",[107,659,660,663],{"class":109,"line":184},[107,661,662],{"class":369},"  REPEAT_SUBMIT_KEY_METADATA",[107,664,657],{"class":147},[107,666,667,670,672,674,676,678],{"class":109,"line":205},[107,668,669],{"class":147},"}",[107,671,376],{"class":120},[107,673,137],{"class":136},[107,675,402],{"class":140},[107,677,144],{"class":136},[107,679,148],{"class":147},[107,681,682,684,686,689,691,693,695,698,700],{"class":109,"line":211},[107,683,363],{"class":120},[107,685,366],{"class":147},[107,687,688],{"class":369}," ApiException",[107,690,373],{"class":147},[107,692,376],{"class":120},[107,694,137],{"class":136},[107,696,697],{"class":140},"..\u002Fexception\u002Fapi.exception",[107,699,144],{"class":136},[107,701,148],{"class":147},[107,703,704,706,708,711,713,715,717,720,722],{"class":109,"line":232},[107,705,363],{"class":120},[107,707,366],{"class":147},[107,709,710],{"class":369}," InjectRedis",[107,712,373],{"class":147},[107,714,376],{"class":120},[107,716,137],{"class":136},[107,718,719],{"class":140},"@nestjs-modules\u002Fioredis",[107,721,144],{"class":136},[107,723,148],{"class":147},[107,725,726,728,731,734,736,739,741],{"class":109,"line":239},[107,727,363],{"class":120},[107,729,730],{"class":369}," Redis ",[107,732,733],{"class":120},"from",[107,735,137],{"class":136},[107,737,738],{"class":140},"ioredis",[107,740,144],{"class":136},[107,742,148],{"class":147},[107,744,745,747,749,752,754,756,758,761,763],{"class":109,"line":245},[107,746,363],{"class":120},[107,748,366],{"class":147},[107,750,751],{"class":369}," Request",[107,753,373],{"class":147},[107,755,376],{"class":120},[107,757,137],{"class":136},[107,759,760],{"class":140},"express",[107,762,144],{"class":136},[107,764,148],{"class":147},[107,766,767,769,771,774,776,778,780,783,785],{"class":109,"line":251},[107,768,363],{"class":120},[107,770,366],{"class":147},[107,772,773],{"class":369}," CommonService",[107,775,373],{"class":147},[107,777,376],{"class":120},[107,779,137],{"class":136},[107,781,782],{"class":140},"src\u002Fshared\u002Fcommon\u002Fcommon.service",[107,784,144],{"class":136},[107,786,148],{"class":147},[107,788,789],{"class":109,"line":272},[107,790,236],{"emptyLinePlaceholder":235},[107,792,793,796,799],{"class":109,"line":278},[107,794,795],{"class":147},"@",[107,797,798],{"class":517},"Injectable",[107,800,801],{"class":369},"()\n",[107,803,804,806,808,811,814,816],{"class":109,"line":299},[107,805,121],{"class":120},[107,807,417],{"class":124},[107,809,810],{"class":420}," RepeatSubmitGuard",[107,812,813],{"class":124}," implements",[107,815,578],{"class":420},[107,817,424],{"class":147},[107,819,820,823],{"class":109,"line":305},[107,821,822],{"class":124},"  constructor",[107,824,825],{"class":147},"(\n",[107,827,828,831,834,837,840,842],{"class":109,"line":326},[107,829,830],{"class":124},"    private",[107,832,833],{"class":124}," readonly",[107,835,836],{"class":496}," reflector",[107,838,839],{"class":132},":",[107,841,609],{"class":420},[107,843,657],{"class":147},[107,845,846,849,852,855,858,860,863,865,868],{"class":109,"line":332},[107,847,848],{"class":147},"    @",[107,850,851],{"class":517},"InjectRedis",[107,853,854],{"class":369},"() ",[107,856,857],{"class":124},"private",[107,859,833],{"class":124},[107,861,862],{"class":496}," redis",[107,864,839],{"class":132},[107,866,867],{"class":420}," Redis",[107,869,657],{"class":147},[107,871,873,875,877,880,882,884],{"class":109,"line":872},19,[107,874,830],{"class":124},[107,876,833],{"class":124},[107,878,879],{"class":496}," commonService",[107,881,839],{"class":132},[107,883,773],{"class":420},[107,885,657],{"class":147},[107,887,889,892],{"class":109,"line":888},20,[107,890,891],{"class":147},"  )",[107,893,894],{"class":147}," {}\n",[107,896,898,901,905,907,910,912,914,916,918,921,924,927,930],{"class":109,"line":897},21,[107,899,900],{"class":124},"  async",[107,902,904],{"class":903},"sVXei"," canActivate",[107,906,521],{"class":147},[107,908,909],{"class":496},"context",[107,911,839],{"class":132},[107,913,583],{"class":420},[107,915,504],{"class":147},[107,917,839],{"class":132},[107,919,920],{"class":420}," Promise",[107,922,923],{"class":147},"\u003C",[107,925,926],{"class":436},"boolean",[107,928,929],{"class":147},">",[107,931,424],{"class":147},[107,933,935,938,941,943,945,947,951,953,956,958,961],{"class":109,"line":934},22,[107,936,937],{"class":124},"    const",[107,939,940],{"class":128}," repeatSubmitOption",[107,942,839],{"class":132},[107,944,421],{"class":420},[107,946,133],{"class":132},[107,948,950],{"class":949},"s39Yj"," this",[107,952,533],{"class":147},[107,954,955],{"class":369},"reflector",[107,957,533],{"class":147},[107,959,960],{"class":517},"get",[107,962,825],{"class":520},[107,964,966,969],{"class":109,"line":965},23,[107,967,968],{"class":128},"      REPEAT_SUBMIT_KEY_METADATA",[107,970,657],{"class":147},[107,972,974,977,979,982,984],{"class":109,"line":973},24,[107,975,976],{"class":369},"      context",[107,978,533],{"class":147},[107,980,981],{"class":517},"getHandler",[107,983,546],{"class":520},[107,985,657],{"class":147},[107,987,989,992],{"class":109,"line":988},25,[107,990,991],{"class":520},"    )",[107,993,148],{"class":147},[107,995,997,1000,1002,1005,1008,1011,1014,1018],{"class":109,"line":996},26,[107,998,999],{"class":120},"    if",[107,1001,493],{"class":520},[107,1003,1004],{"class":132},"!",[107,1006,1007],{"class":369},"repeatSubmitOption",[107,1009,1010],{"class":520},") ",[107,1012,1013],{"class":120},"return",[107,1015,1017],{"class":1016},"syTEX"," true",[107,1019,148],{"class":147},[107,1021,1023,1025,1028,1030,1032,1034,1037,1039,1042,1044,1046,1049,1051],{"class":109,"line":1022},27,[107,1024,937],{"class":124},[107,1026,1027],{"class":128}," request",[107,1029,839],{"class":132},[107,1031,751],{"class":420},[107,1033,133],{"class":132},[107,1035,1036],{"class":369}," context",[107,1038,533],{"class":147},[107,1040,1041],{"class":517},"switchToHttp",[107,1043,546],{"class":520},[107,1045,533],{"class":147},[107,1047,1048],{"class":517},"getRequest",[107,1050,546],{"class":520},[107,1052,148],{"class":147},[107,1054,1056,1058,1061,1063,1066,1069,1072,1074,1076,1079,1082],{"class":109,"line":1055},28,[107,1057,937],{"class":124},[107,1059,1060],{"class":128}," _key",[107,1062,133],{"class":132},[107,1064,1065],{"class":136}," `${",[107,1067,1068],{"class":128},"REDIS_REPEAT_SUBMIT_KEY",[107,1070,1071],{"class":136},"}${",[107,1073,69],{"class":369},[107,1075,533],{"class":136},[107,1077,1078],{"class":369},"url",[107,1080,1081],{"class":136},"}`",[107,1083,148],{"class":147},[107,1085,1087,1089,1092,1094,1097,1099,1101,1104,1106,1108,1110,1113,1115],{"class":109,"line":1086},29,[107,1088,937],{"class":124},[107,1090,1091],{"class":128}," cache",[107,1093,133],{"class":132},[107,1095,1096],{"class":120}," await",[107,1098,950],{"class":949},[107,1100,533],{"class":147},[107,1102,1103],{"class":369},"redis",[107,1105,533],{"class":147},[107,1107,960],{"class":517},[107,1109,521],{"class":520},[107,1111,1112],{"class":369},"_key",[107,1114,504],{"class":520},[107,1116,148],{"class":147},[107,1118,1120,1122,1125,1127],{"class":109,"line":1119},30,[107,1121,937],{"class":124},[107,1123,1124],{"class":128}," data",[107,1126,133],{"class":132},[107,1128,424],{"class":147},[107,1130,1132,1135,1137,1139,1141,1144,1146,1149,1151,1153,1155],{"class":109,"line":1131},31,[107,1133,1134],{"class":520},"      ip",[107,1136,839],{"class":147},[107,1138,950],{"class":949},[107,1140,533],{"class":147},[107,1142,1143],{"class":369},"commonService",[107,1145,533],{"class":147},[107,1147,1148],{"class":517},"getIp",[107,1150,521],{"class":520},[107,1152,69],{"class":369},[107,1154,504],{"class":520},[107,1156,657],{"class":147},[107,1158,1160,1163,1165,1167,1169,1172],{"class":109,"line":1159},32,[107,1161,1162],{"class":520},"      body",[107,1164,839],{"class":147},[107,1166,1027],{"class":369},[107,1168,533],{"class":147},[107,1170,1171],{"class":369},"body",[107,1173,657],{"class":147},[107,1175,1177,1180,1182,1184,1186,1189],{"class":109,"line":1176},33,[107,1178,1179],{"class":520},"      prams",[107,1181,839],{"class":147},[107,1183,1027],{"class":369},[107,1185,533],{"class":147},[107,1187,1188],{"class":369},"params",[107,1190,657],{"class":147},[107,1192,1194,1197,1199,1201,1203,1206],{"class":109,"line":1193},34,[107,1195,1196],{"class":520},"      query",[107,1198,839],{"class":147},[107,1200,1027],{"class":369},[107,1202,533],{"class":147},[107,1204,1205],{"class":369},"query",[107,1207,657],{"class":147},[107,1209,1211],{"class":109,"line":1210},35,[107,1212,1213],{"class":147},"    };\n",[107,1215,1217,1219,1222,1224,1227,1229,1232,1234,1237,1239],{"class":109,"line":1216},36,[107,1218,937],{"class":124},[107,1220,1221],{"class":128}," dataStr",[107,1223,133],{"class":132},[107,1225,1226],{"class":128}," JSON",[107,1228,533],{"class":147},[107,1230,1231],{"class":517},"stringify",[107,1233,521],{"class":520},[107,1235,1236],{"class":369},"data",[107,1238,504],{"class":520},[107,1240,148],{"class":147},[107,1242,1244,1246,1248,1250,1253,1255],{"class":109,"line":1243},37,[107,1245,999],{"class":120},[107,1247,493],{"class":520},[107,1249,1004],{"class":132},[107,1251,1252],{"class":369},"cache",[107,1254,1010],{"class":520},[107,1256,1257],{"class":147},"{\n",[107,1259,1261,1264,1266,1269,1271],{"class":109,"line":1260},38,[107,1262,1263],{"class":120},"      if",[107,1265,493],{"class":520},[107,1267,1268],{"class":369},"dataStr",[107,1270,1010],{"class":520},[107,1272,1257],{"class":147},[107,1274,1276],{"class":109,"line":1275},39,[107,1277,1278],{"class":113},"        \u002F\u002F 以url作为key去做缓存，缓存时间设置为元信息传递的时间 默认时间1s\n",[107,1280,1282,1285,1287,1289,1291,1294,1296,1298,1300,1302,1304,1306,1309,1311,1313,1315,1317,1320,1322],{"class":109,"line":1281},40,[107,1283,1284],{"class":949},"        this",[107,1286,533],{"class":147},[107,1288,1103],{"class":369},[107,1290,533],{"class":147},[107,1292,1293],{"class":517},"set",[107,1295,521],{"class":520},[107,1297,1112],{"class":369},[107,1299,527],{"class":147},[107,1301,1221],{"class":369},[107,1303,527],{"class":147},[107,1305,137],{"class":136},[107,1307,1308],{"class":140},"EX",[107,1310,144],{"class":136},[107,1312,527],{"class":147},[107,1314,940],{"class":369},[107,1316,533],{"class":147},[107,1318,1319],{"class":369},"interval",[107,1321,504],{"class":520},[107,1323,148],{"class":147},[107,1325,1327],{"class":109,"line":1326},41,[107,1328,1329],{"class":147},"      }\n",[107,1331,1333,1336,1339],{"class":109,"line":1332},42,[107,1334,1335],{"class":147},"    }",[107,1337,1338],{"class":120}," else",[107,1340,424],{"class":147},[107,1342,1344,1346,1348,1350,1353,1355,1358,1360,1362],{"class":109,"line":1343},43,[107,1345,1263],{"class":120},[107,1347,493],{"class":520},[107,1349,1268],{"class":369},[107,1351,1352],{"class":132}," &&",[107,1354,1221],{"class":369},[107,1356,1357],{"class":132}," ===",[107,1359,1091],{"class":369},[107,1361,1010],{"class":520},[107,1363,1257],{"class":147},[107,1365,1367],{"class":109,"line":1366},44,[107,1368,1369],{"class":113},"        \u002F\u002F ApiException是什么可以查看 异常过滤器\n",[107,1371,1373,1376,1379,1381,1383,1385,1387,1390,1392],{"class":109,"line":1372},45,[107,1374,1375],{"class":120},"        throw",[107,1377,1378],{"class":132}," new",[107,1380,688],{"class":517},[107,1382,521],{"class":520},[107,1384,1007],{"class":369},[107,1386,533],{"class":147},[107,1388,1389],{"class":369},"message",[107,1391,504],{"class":520},[107,1393,148],{"class":147},[107,1395,1397],{"class":109,"line":1396},46,[107,1398,1329],{"class":147},[107,1400,1402],{"class":109,"line":1401},47,[107,1403,1404],{"class":147},"    }\n",[107,1406,1408,1411,1413],{"class":109,"line":1407},48,[107,1409,1410],{"class":120},"    return",[107,1412,1017],{"class":1016},[107,1414,148],{"class":147},[107,1416,1418],{"class":109,"line":1417},49,[107,1419,1420],{"class":147},"  }\n",[107,1422,1424],{"class":109,"line":1423},50,[107,1425,478],{"class":147},[92,1427,1428],{"id":1428},"注册",[26,1430,1431,1434],{},[34,1432,1433],{},"app.module.ts","使用:",[99,1436,1438],{"className":101,"code":1437,"language":103,"meta":9,"style":9},"@Module({\n  imports: [],\n  providers: [\n    {\n      provide: APP_GUARD,\n      useClass: RepeatSubmitGuard,\n    },\n  ]\n})\n",[34,1439,1440,1451,1463,1473,1478,1490,1501,1506,1511],{"__ignoreMap":9},[107,1441,1442,1444,1447,1449],{"class":109,"line":110},[107,1443,795],{"class":147},[107,1445,1446],{"class":517},"Module",[107,1448,521],{"class":369},[107,1450,1257],{"class":147},[107,1452,1453,1456,1458,1461],{"class":109,"line":117},[107,1454,1455],{"class":520},"  imports",[107,1457,839],{"class":147},[107,1459,1460],{"class":369}," []",[107,1462,657],{"class":147},[107,1464,1465,1468,1470],{"class":109,"line":151},[107,1466,1467],{"class":520},"  providers",[107,1469,839],{"class":147},[107,1471,1472],{"class":369}," [\n",[107,1474,1475],{"class":109,"line":157},[107,1476,1477],{"class":147},"    {\n",[107,1479,1480,1483,1485,1488],{"class":109,"line":178},[107,1481,1482],{"class":520},"      provide",[107,1484,839],{"class":147},[107,1486,1487],{"class":128}," APP_GUARD",[107,1489,657],{"class":147},[107,1491,1492,1495,1497,1499],{"class":109,"line":184},[107,1493,1494],{"class":520},"      useClass",[107,1496,839],{"class":147},[107,1498,810],{"class":369},[107,1500,657],{"class":147},[107,1502,1503],{"class":109,"line":205},[107,1504,1505],{"class":147},"    },\n",[107,1507,1508],{"class":109,"line":211},[107,1509,1510],{"class":369},"  ]\n",[107,1512,1513,1515],{"class":109,"line":232},[107,1514,669],{"class":147},[107,1516,1517],{"class":369},")\n",[92,1519,1520],{"id":1520},"控制层使用",[99,1522,1524],{"className":101,"code":1523,"language":103,"meta":9,"style":9},"import { Controller, Post, Body, Get, Request } from \"@nestjs\u002Fcommon\";\nexport class UserController {\n  constructor() {}\n\n  \u002F\u002F 添加这一行代码。如果2s请求频繁那么就会提示 “操作过于频繁”\n  @RepeatSubmit({\n    interval: 2,\n    message: \"操作过于频繁\",\n  })\n  @Post(\"create\")\n  async create(@Body() body: { username: string; password: string }) {\n    return \"success\";\n  }\n}\n",[34,1525,1526,1566,1577,1585,1589,1594,1606,1618,1633,1640,1658,1700,1713,1717],{"__ignoreMap":9},[107,1527,1528,1530,1532,1535,1537,1540,1542,1545,1547,1550,1552,1554,1556,1558,1560,1562,1564],{"class":109,"line":110},[107,1529,363],{"class":120},[107,1531,366],{"class":147},[107,1533,1534],{"class":369}," Controller",[107,1536,527],{"class":147},[107,1538,1539],{"class":369}," Post",[107,1541,527],{"class":147},[107,1543,1544],{"class":369}," Body",[107,1546,527],{"class":147},[107,1548,1549],{"class":369}," Get",[107,1551,527],{"class":147},[107,1553,751],{"class":369},[107,1555,373],{"class":147},[107,1557,376],{"class":120},[107,1559,137],{"class":136},[107,1561,381],{"class":140},[107,1563,144],{"class":136},[107,1565,148],{"class":147},[107,1567,1568,1570,1572,1575],{"class":109,"line":117},[107,1569,121],{"class":120},[107,1571,417],{"class":124},[107,1573,1574],{"class":420}," UserController",[107,1576,424],{"class":147},[107,1578,1579,1581,1583],{"class":109,"line":151},[107,1580,822],{"class":124},[107,1582,546],{"class":147},[107,1584,894],{"class":147},[107,1586,1587],{"class":109,"line":157},[107,1588,236],{"emptyLinePlaceholder":235},[107,1590,1591],{"class":109,"line":178},[107,1592,1593],{"class":113},"  \u002F\u002F 添加这一行代码。如果2s请求频繁那么就会提示 “操作过于频繁”\n",[107,1595,1596,1599,1602,1604],{"class":109,"line":184},[107,1597,1598],{"class":147},"  @",[107,1600,1601],{"class":517},"RepeatSubmit",[107,1603,521],{"class":369},[107,1605,1257],{"class":147},[107,1607,1608,1611,1613,1616],{"class":109,"line":205},[107,1609,1610],{"class":520},"    interval",[107,1612,839],{"class":147},[107,1614,1615],{"class":442}," 2",[107,1617,657],{"class":147},[107,1619,1620,1623,1625,1627,1629,1631],{"class":109,"line":211},[107,1621,1622],{"class":520},"    message",[107,1624,839],{"class":147},[107,1626,137],{"class":136},[107,1628,466],{"class":140},[107,1630,144],{"class":136},[107,1632,657],{"class":147},[107,1634,1635,1638],{"class":109,"line":232},[107,1636,1637],{"class":147},"  }",[107,1639,1517],{"class":369},[107,1641,1642,1644,1647,1649,1651,1654,1656],{"class":109,"line":239},[107,1643,1598],{"class":147},[107,1645,1646],{"class":517},"Post",[107,1648,521],{"class":369},[107,1650,144],{"class":136},[107,1652,1653],{"class":140},"create",[107,1655,144],{"class":136},[107,1657,1517],{"class":369},[107,1659,1660,1662,1665,1668,1671,1673,1675,1677,1679,1682,1684,1686,1688,1691,1693,1695,1698],{"class":109,"line":245},[107,1661,900],{"class":124},[107,1663,1664],{"class":903}," create",[107,1666,1667],{"class":147},"(@",[107,1669,1670],{"class":517},"Body",[107,1672,854],{"class":369},[107,1674,1171],{"class":496},[107,1676,839],{"class":132},[107,1678,366],{"class":147},[107,1680,1681],{"class":429}," username",[107,1683,839],{"class":132},[107,1685,459],{"class":436},[107,1687,446],{"class":147},[107,1689,1690],{"class":429}," password",[107,1692,839],{"class":132},[107,1694,459],{"class":436},[107,1696,1697],{"class":147}," })",[107,1699,424],{"class":147},[107,1701,1702,1704,1706,1709,1711],{"class":109,"line":251},[107,1703,1410],{"class":120},[107,1705,137],{"class":136},[107,1707,1708],{"class":140},"success",[107,1710,144],{"class":136},[107,1712,148],{"class":147},[107,1714,1715],{"class":109,"line":272},[107,1716,1420],{"class":147},[107,1718,1719],{"class":109,"line":278},[107,1720,478],{"class":147},[88,1722,1723],{"id":1723},"操作权限",[92,1725,353],{"id":1726},"自定义元数据-1",[99,1728,1730],{"className":101,"code":1729,"language":103,"meta":9,"style":9},"export enum PermissionRelationEnum {\n  AND = \"AND\",\n  OR = \"OR\",\n}\n",[34,1731,1732,1744,1760,1776],{"__ignoreMap":9},[107,1733,1734,1736,1739,1742],{"class":109,"line":110},[107,1735,121],{"class":120},[107,1737,1738],{"class":124}," enum",[107,1740,1741],{"class":420}," PermissionRelationEnum",[107,1743,424],{"class":147},[107,1745,1746,1749,1751,1753,1756,1758],{"class":109,"line":117},[107,1747,1748],{"class":128},"  AND",[107,1750,133],{"class":132},[107,1752,137],{"class":136},[107,1754,1755],{"class":140},"AND",[107,1757,144],{"class":136},[107,1759,657],{"class":147},[107,1761,1762,1765,1767,1769,1772,1774],{"class":109,"line":151},[107,1763,1764],{"class":128},"  OR",[107,1766,133],{"class":132},[107,1768,137],{"class":136},[107,1770,1771],{"class":140},"OR",[107,1773,144],{"class":136},[107,1775,657],{"class":147},[107,1777,1778],{"class":109,"line":157},[107,1779,478],{"class":147},[99,1781,1783],{"className":101,"code":1782,"language":103,"meta":9,"style":9},"import { SetMetadata } from \"@nestjs\u002Fcommon\";\nimport { PermissionRelationEnum } from \"..\u002Fenum\u002Fpermission.enum\";\nimport { PERMISSION_KEY_METADATA } from \"..\u002Fconstants\u002Fmetadata.constant\";\n\nexport class PermissionOption {\n  permissionArr: string[];\n  relation: PermissionRelationEnum;\n}\nexport const Permission = (\n  permissions: string | string[],\n  relation: PermissionRelationEnum = PermissionRelationEnum.OR, \u002F\u002F 权限的关系， 是并且还是或者的关系\n) => {\n  const permissionObj: PermissionOption = {\n    permissionArr: [],\n    relation,\n  };\n  if (typeof permissions === \"string\") {\n    permissionObj.permissionArr = [permissions];\n  } else if (permissions instanceof Array) {\n    permissionObj.permissionArr = permissions;\n  }\n  return SetMetadata(PERMISSION_KEY_METADATA, permissionObj);\n};\n",[34,1784,1785,1805,1826,1846,1850,1861,1875,1886,1890,1904,1922,1943,1952,1968,1979,1986,1991,2017,2040,2063,2077,2081,2100],{"__ignoreMap":9},[107,1786,1787,1789,1791,1793,1795,1797,1799,1801,1803],{"class":109,"line":110},[107,1788,363],{"class":120},[107,1790,366],{"class":147},[107,1792,370],{"class":369},[107,1794,373],{"class":147},[107,1796,376],{"class":120},[107,1798,137],{"class":136},[107,1800,381],{"class":140},[107,1802,144],{"class":136},[107,1804,148],{"class":147},[107,1806,1807,1809,1811,1813,1815,1817,1819,1822,1824],{"class":109,"line":117},[107,1808,363],{"class":120},[107,1810,366],{"class":147},[107,1812,1741],{"class":369},[107,1814,373],{"class":147},[107,1816,376],{"class":120},[107,1818,137],{"class":136},[107,1820,1821],{"class":140},"..\u002Fenum\u002Fpermission.enum",[107,1823,144],{"class":136},[107,1825,148],{"class":147},[107,1827,1828,1830,1832,1834,1836,1838,1840,1842,1844],{"class":109,"line":151},[107,1829,363],{"class":120},[107,1831,366],{"class":147},[107,1833,218],{"class":369},[107,1835,373],{"class":147},[107,1837,376],{"class":120},[107,1839,137],{"class":136},[107,1841,402],{"class":140},[107,1843,144],{"class":136},[107,1845,148],{"class":147},[107,1847,1848],{"class":109,"line":157},[107,1849,236],{"emptyLinePlaceholder":235},[107,1851,1852,1854,1856,1859],{"class":109,"line":178},[107,1853,121],{"class":120},[107,1855,417],{"class":124},[107,1857,1858],{"class":420}," PermissionOption",[107,1860,424],{"class":147},[107,1862,1863,1866,1868,1870,1873],{"class":109,"line":184},[107,1864,1865],{"class":429},"  permissionArr",[107,1867,839],{"class":132},[107,1869,459],{"class":436},[107,1871,1872],{"class":369},"[]",[107,1874,148],{"class":147},[107,1876,1877,1880,1882,1884],{"class":109,"line":205},[107,1878,1879],{"class":429},"  relation",[107,1881,839],{"class":132},[107,1883,1741],{"class":420},[107,1885,148],{"class":147},[107,1887,1888],{"class":109,"line":211},[107,1889,478],{"class":147},[107,1891,1892,1894,1896,1899,1901],{"class":109,"line":232},[107,1893,121],{"class":120},[107,1895,125],{"class":124},[107,1897,1898],{"class":487}," Permission",[107,1900,133],{"class":132},[107,1902,1903],{"class":369}," (\n",[107,1905,1906,1909,1911,1913,1916,1918,1920],{"class":109,"line":239},[107,1907,1908],{"class":496},"  permissions",[107,1910,839],{"class":132},[107,1912,459],{"class":436},[107,1914,1915],{"class":132}," |",[107,1917,459],{"class":436},[107,1919,1872],{"class":369},[107,1921,657],{"class":147},[107,1923,1924,1926,1928,1930,1932,1934,1936,1938,1940],{"class":109,"line":245},[107,1925,1879],{"class":496},[107,1927,839],{"class":132},[107,1929,1741],{"class":420},[107,1931,133],{"class":132},[107,1933,1741],{"class":369},[107,1935,533],{"class":147},[107,1937,1771],{"class":128},[107,1939,527],{"class":147},[107,1941,1942],{"class":113}," \u002F\u002F 权限的关系， 是并且还是或者的关系\n",[107,1944,1945,1947,1950],{"class":109,"line":251},[107,1946,1010],{"class":369},[107,1948,1949],{"class":124},"=>",[107,1951,424],{"class":147},[107,1953,1954,1957,1960,1962,1964,1966],{"class":109,"line":272},[107,1955,1956],{"class":124},"  const",[107,1958,1959],{"class":128}," permissionObj",[107,1961,839],{"class":132},[107,1963,1858],{"class":420},[107,1965,133],{"class":132},[107,1967,424],{"class":147},[107,1969,1970,1973,1975,1977],{"class":109,"line":278},[107,1971,1972],{"class":520},"    permissionArr",[107,1974,839],{"class":147},[107,1976,1460],{"class":520},[107,1978,657],{"class":147},[107,1980,1981,1984],{"class":109,"line":299},[107,1982,1983],{"class":369},"    relation",[107,1985,657],{"class":147},[107,1987,1988],{"class":109,"line":305},[107,1989,1990],{"class":147},"  };\n",[107,1992,1993,1996,1998,2001,2004,2006,2008,2011,2013,2015],{"class":109,"line":326},[107,1994,1995],{"class":120},"  if",[107,1997,493],{"class":520},[107,1999,2000],{"class":132},"typeof",[107,2002,2003],{"class":369}," permissions",[107,2005,1357],{"class":132},[107,2007,137],{"class":136},[107,2009,2010],{"class":140},"string",[107,2012,144],{"class":136},[107,2014,1010],{"class":520},[107,2016,1257],{"class":147},[107,2018,2019,2022,2024,2027,2029,2032,2035,2038],{"class":109,"line":332},[107,2020,2021],{"class":369},"    permissionObj",[107,2023,533],{"class":147},[107,2025,2026],{"class":369},"permissionArr",[107,2028,133],{"class":132},[107,2030,2031],{"class":520}," [",[107,2033,2034],{"class":369},"permissions",[107,2036,2037],{"class":520},"]",[107,2039,148],{"class":147},[107,2041,2042,2044,2046,2049,2051,2053,2056,2059,2061],{"class":109,"line":872},[107,2043,1637],{"class":147},[107,2045,1338],{"class":120},[107,2047,2048],{"class":120}," if",[107,2050,493],{"class":520},[107,2052,2034],{"class":369},[107,2054,2055],{"class":132}," instanceof",[107,2057,2058],{"class":420}," Array",[107,2060,1010],{"class":520},[107,2062,1257],{"class":147},[107,2064,2065,2067,2069,2071,2073,2075],{"class":109,"line":888},[107,2066,2021],{"class":369},[107,2068,533],{"class":147},[107,2070,2026],{"class":369},[107,2072,133],{"class":132},[107,2074,2003],{"class":369},[107,2076,148],{"class":147},[107,2078,2079],{"class":109,"line":897},[107,2080,1420],{"class":147},[107,2082,2083,2085,2087,2089,2092,2094,2096,2098],{"class":109,"line":934},[107,2084,514],{"class":120},[107,2086,370],{"class":517},[107,2088,521],{"class":520},[107,2090,2091],{"class":128},"PERMISSION_KEY_METADATA",[107,2093,527],{"class":147},[107,2095,1959],{"class":369},[107,2097,504],{"class":520},[107,2099,148],{"class":147},[107,2101,2102],{"class":109,"line":965},[107,2103,561],{"class":147},[92,2105,564],{"id":2106},"自定义守卫-1",[99,2108,2110],{"className":101,"code":2109,"language":103,"meta":9,"style":9},"import { CanActivate, ExecutionContext, Injectable } from \"@nestjs\u002Fcommon\";\nimport { Reflector } from \"@nestjs\u002Fcore\";\nimport { Observable } from \"rxjs\";\nimport { PermissionOption } from \"..\u002Fdecorator\u002Fpermission.decorator\";\nimport { PERMISSION_KEY_METADATA } from \"..\u002Fconstants\u002Fmetadata.constant\";\nimport { PermissionRelationEnum } from \"..\u002Fenum\u002Fpermission.enum\";\nimport { ApiException } from \"..\u002Fexception\u002Fapi.exception\";\nimport { HttpStatusCode } from \"..\u002Fenum\u002Fhttp.enum\";\n\n@Injectable()\nexport class PermissionGuard implements CanActivate {\n  constructor(private readonly reflector: Reflector) {}\n  canActivate(context: ExecutionContext): boolean | Promise\u003Cboolean> | Observable\u003Cboolean> {\n    const permissionObj = this.reflector.getAllAndOverride\u003CPermissionOption>(\n      PERMISSION_KEY_METADATA,\n      [context.getHandler(), context.getClass()],\n    );\n    if (!permissionObj || !permissionObj.permissionArr.length) return true;\n\n    const request = context.switchToHttp().getRequest();\n    \u002F\u002F 权限挂载在用户信心之上\n    const user = request.user;\n    const permissions = user?.permissions || [];\n    if (permissions.includes(\"*\")) return true;\n    let result = false;\n    if (permissionObj.relation === PermissionRelationEnum.OR) {\n      result = permissionObj.permissionArr.some((userPermission) => {\n        return permissions.includes(userPermission);\n      });\n    } else if (permissionObj.relation === PermissionRelationEnum.AND) {\n      result = permissionObj.permissionArr.every((userPermission) => {\n        return permissions.includes(userPermission);\n      });\n    }\n    if (!result) throw new ApiException(\"暂无权限访问，请联系管理员\", HttpStatusCode.UNAUTHORIZED);\n    return result;\n  }\n}\n",[34,2111,2112,2140,2160,2182,2203,2223,2243,2263,2285,2289,2297,2312,2332,2374,2402,2409,2436,2442,2478,2482,2506,2511,2529,2550,2581,2596,2621,2652,2671,2680,2708,2737,2755,2763,2767,2809,2817,2821],{"__ignoreMap":9},[107,2113,2114,2116,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138],{"class":109,"line":110},[107,2115,363],{"class":120},[107,2117,366],{"class":147},[107,2119,578],{"class":369},[107,2121,527],{"class":147},[107,2123,583],{"class":369},[107,2125,527],{"class":147},[107,2127,588],{"class":369},[107,2129,373],{"class":147},[107,2131,376],{"class":120},[107,2133,137],{"class":136},[107,2135,381],{"class":140},[107,2137,144],{"class":136},[107,2139,148],{"class":147},[107,2141,2142,2144,2146,2148,2150,2152,2154,2156,2158],{"class":109,"line":117},[107,2143,363],{"class":120},[107,2145,366],{"class":147},[107,2147,609],{"class":369},[107,2149,373],{"class":147},[107,2151,376],{"class":120},[107,2153,137],{"class":136},[107,2155,618],{"class":140},[107,2157,144],{"class":136},[107,2159,148],{"class":147},[107,2161,2162,2164,2166,2169,2171,2173,2175,2178,2180],{"class":109,"line":151},[107,2163,363],{"class":120},[107,2165,366],{"class":147},[107,2167,2168],{"class":369}," Observable",[107,2170,373],{"class":147},[107,2172,376],{"class":120},[107,2174,137],{"class":136},[107,2176,2177],{"class":140},"rxjs",[107,2179,144],{"class":136},[107,2181,148],{"class":147},[107,2183,2184,2186,2188,2190,2192,2194,2196,2199,2201],{"class":109,"line":157},[107,2185,363],{"class":120},[107,2187,366],{"class":147},[107,2189,1858],{"class":369},[107,2191,373],{"class":147},[107,2193,376],{"class":120},[107,2195,137],{"class":136},[107,2197,2198],{"class":140},"..\u002Fdecorator\u002Fpermission.decorator",[107,2200,144],{"class":136},[107,2202,148],{"class":147},[107,2204,2205,2207,2209,2211,2213,2215,2217,2219,2221],{"class":109,"line":178},[107,2206,363],{"class":120},[107,2208,366],{"class":147},[107,2210,218],{"class":369},[107,2212,373],{"class":147},[107,2214,376],{"class":120},[107,2216,137],{"class":136},[107,2218,402],{"class":140},[107,2220,144],{"class":136},[107,2222,148],{"class":147},[107,2224,2225,2227,2229,2231,2233,2235,2237,2239,2241],{"class":109,"line":184},[107,2226,363],{"class":120},[107,2228,366],{"class":147},[107,2230,1741],{"class":369},[107,2232,373],{"class":147},[107,2234,376],{"class":120},[107,2236,137],{"class":136},[107,2238,1821],{"class":140},[107,2240,144],{"class":136},[107,2242,148],{"class":147},[107,2244,2245,2247,2249,2251,2253,2255,2257,2259,2261],{"class":109,"line":205},[107,2246,363],{"class":120},[107,2248,366],{"class":147},[107,2250,688],{"class":369},[107,2252,373],{"class":147},[107,2254,376],{"class":120},[107,2256,137],{"class":136},[107,2258,697],{"class":140},[107,2260,144],{"class":136},[107,2262,148],{"class":147},[107,2264,2265,2267,2269,2272,2274,2276,2278,2281,2283],{"class":109,"line":211},[107,2266,363],{"class":120},[107,2268,366],{"class":147},[107,2270,2271],{"class":369}," HttpStatusCode",[107,2273,373],{"class":147},[107,2275,376],{"class":120},[107,2277,137],{"class":136},[107,2279,2280],{"class":140},"..\u002Fenum\u002Fhttp.enum",[107,2282,144],{"class":136},[107,2284,148],{"class":147},[107,2286,2287],{"class":109,"line":232},[107,2288,236],{"emptyLinePlaceholder":235},[107,2290,2291,2293,2295],{"class":109,"line":239},[107,2292,795],{"class":147},[107,2294,798],{"class":517},[107,2296,801],{"class":369},[107,2298,2299,2301,2303,2306,2308,2310],{"class":109,"line":245},[107,2300,121],{"class":120},[107,2302,417],{"class":124},[107,2304,2305],{"class":420}," PermissionGuard",[107,2307,813],{"class":124},[107,2309,578],{"class":420},[107,2311,424],{"class":147},[107,2313,2314,2316,2318,2320,2322,2324,2326,2328,2330],{"class":109,"line":251},[107,2315,822],{"class":124},[107,2317,521],{"class":147},[107,2319,857],{"class":124},[107,2321,833],{"class":124},[107,2323,836],{"class":496},[107,2325,839],{"class":132},[107,2327,609],{"class":420},[107,2329,504],{"class":147},[107,2331,894],{"class":147},[107,2333,2334,2337,2339,2341,2343,2345,2347,2349,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372],{"class":109,"line":272},[107,2335,2336],{"class":903},"  canActivate",[107,2338,521],{"class":147},[107,2340,909],{"class":496},[107,2342,839],{"class":132},[107,2344,583],{"class":420},[107,2346,504],{"class":147},[107,2348,839],{"class":132},[107,2350,2351],{"class":436}," boolean",[107,2353,1915],{"class":132},[107,2355,920],{"class":420},[107,2357,923],{"class":147},[107,2359,926],{"class":436},[107,2361,929],{"class":147},[107,2363,1915],{"class":132},[107,2365,2168],{"class":420},[107,2367,923],{"class":147},[107,2369,926],{"class":436},[107,2371,929],{"class":147},[107,2373,424],{"class":147},[107,2375,2376,2378,2380,2382,2384,2386,2388,2390,2393,2395,2398,2400],{"class":109,"line":278},[107,2377,937],{"class":124},[107,2379,1959],{"class":128},[107,2381,133],{"class":132},[107,2383,950],{"class":949},[107,2385,533],{"class":147},[107,2387,955],{"class":369},[107,2389,533],{"class":147},[107,2391,2392],{"class":517},"getAllAndOverride",[107,2394,923],{"class":147},[107,2396,2397],{"class":420},"PermissionOption",[107,2399,929],{"class":147},[107,2401,825],{"class":520},[107,2403,2404,2407],{"class":109,"line":299},[107,2405,2406],{"class":128},"      PERMISSION_KEY_METADATA",[107,2408,657],{"class":147},[107,2410,2411,2414,2416,2418,2420,2422,2424,2426,2428,2431,2434],{"class":109,"line":305},[107,2412,2413],{"class":520},"      [",[107,2415,909],{"class":369},[107,2417,533],{"class":147},[107,2419,981],{"class":517},[107,2421,546],{"class":520},[107,2423,527],{"class":147},[107,2425,1036],{"class":369},[107,2427,533],{"class":147},[107,2429,2430],{"class":517},"getClass",[107,2432,2433],{"class":520},"()]",[107,2435,657],{"class":147},[107,2437,2438,2440],{"class":109,"line":326},[107,2439,991],{"class":520},[107,2441,148],{"class":147},[107,2443,2444,2446,2448,2450,2453,2456,2459,2461,2463,2465,2467,2470,2472,2474,2476],{"class":109,"line":332},[107,2445,999],{"class":120},[107,2447,493],{"class":520},[107,2449,1004],{"class":132},[107,2451,2452],{"class":369},"permissionObj",[107,2454,2455],{"class":132}," ||",[107,2457,2458],{"class":132}," !",[107,2460,2452],{"class":369},[107,2462,533],{"class":147},[107,2464,2026],{"class":369},[107,2466,533],{"class":147},[107,2468,2469],{"class":128},"length",[107,2471,1010],{"class":520},[107,2473,1013],{"class":120},[107,2475,1017],{"class":1016},[107,2477,148],{"class":147},[107,2479,2480],{"class":109,"line":872},[107,2481,236],{"emptyLinePlaceholder":235},[107,2483,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504],{"class":109,"line":888},[107,2485,937],{"class":124},[107,2487,1027],{"class":128},[107,2489,133],{"class":132},[107,2491,1036],{"class":369},[107,2493,533],{"class":147},[107,2495,1041],{"class":517},[107,2497,546],{"class":520},[107,2499,533],{"class":147},[107,2501,1048],{"class":517},[107,2503,546],{"class":520},[107,2505,148],{"class":147},[107,2507,2508],{"class":109,"line":897},[107,2509,2510],{"class":113},"    \u002F\u002F 权限挂载在用户信心之上\n",[107,2512,2513,2515,2518,2520,2522,2524,2527],{"class":109,"line":934},[107,2514,937],{"class":124},[107,2516,2517],{"class":128}," user",[107,2519,133],{"class":132},[107,2521,1027],{"class":369},[107,2523,533],{"class":147},[107,2525,2526],{"class":369},"user",[107,2528,148],{"class":147},[107,2530,2531,2533,2535,2537,2539,2542,2544,2546,2548],{"class":109,"line":965},[107,2532,937],{"class":124},[107,2534,2003],{"class":128},[107,2536,133],{"class":132},[107,2538,2517],{"class":369},[107,2540,2541],{"class":147},"?.",[107,2543,2034],{"class":369},[107,2545,2455],{"class":132},[107,2547,1460],{"class":520},[107,2549,148],{"class":147},[107,2551,2552,2554,2556,2558,2560,2563,2565,2567,2570,2572,2575,2577,2579],{"class":109,"line":973},[107,2553,999],{"class":120},[107,2555,493],{"class":520},[107,2557,2034],{"class":369},[107,2559,533],{"class":147},[107,2561,2562],{"class":517},"includes",[107,2564,521],{"class":520},[107,2566,144],{"class":136},[107,2568,2569],{"class":140},"*",[107,2571,144],{"class":136},[107,2573,2574],{"class":520},")) ",[107,2576,1013],{"class":120},[107,2578,1017],{"class":1016},[107,2580,148],{"class":147},[107,2582,2583,2586,2589,2591,2594],{"class":109,"line":988},[107,2584,2585],{"class":124},"    let",[107,2587,2588],{"class":369}," result",[107,2590,133],{"class":132},[107,2592,2593],{"class":1016}," false",[107,2595,148],{"class":147},[107,2597,2598,2600,2602,2604,2606,2609,2611,2613,2615,2617,2619],{"class":109,"line":996},[107,2599,999],{"class":120},[107,2601,493],{"class":520},[107,2603,2452],{"class":369},[107,2605,533],{"class":147},[107,2607,2608],{"class":369},"relation",[107,2610,1357],{"class":132},[107,2612,1741],{"class":369},[107,2614,533],{"class":147},[107,2616,1771],{"class":128},[107,2618,1010],{"class":520},[107,2620,1257],{"class":147},[107,2622,2623,2626,2628,2630,2632,2634,2636,2639,2641,2643,2646,2648,2650],{"class":109,"line":1022},[107,2624,2625],{"class":369},"      result",[107,2627,133],{"class":132},[107,2629,1959],{"class":369},[107,2631,533],{"class":147},[107,2633,2026],{"class":369},[107,2635,533],{"class":147},[107,2637,2638],{"class":517},"some",[107,2640,521],{"class":520},[107,2642,521],{"class":147},[107,2644,2645],{"class":496},"userPermission",[107,2647,504],{"class":147},[107,2649,507],{"class":124},[107,2651,424],{"class":147},[107,2653,2654,2657,2659,2661,2663,2665,2667,2669],{"class":109,"line":1055},[107,2655,2656],{"class":120},"        return",[107,2658,2003],{"class":369},[107,2660,533],{"class":147},[107,2662,2562],{"class":517},[107,2664,521],{"class":520},[107,2666,2645],{"class":369},[107,2668,504],{"class":520},[107,2670,148],{"class":147},[107,2672,2673,2676,2678],{"class":109,"line":1086},[107,2674,2675],{"class":147},"      }",[107,2677,504],{"class":520},[107,2679,148],{"class":147},[107,2681,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700,2702,2704,2706],{"class":109,"line":1119},[107,2683,1335],{"class":147},[107,2685,1338],{"class":120},[107,2687,2048],{"class":120},[107,2689,493],{"class":520},[107,2691,2452],{"class":369},[107,2693,533],{"class":147},[107,2695,2608],{"class":369},[107,2697,1357],{"class":132},[107,2699,1741],{"class":369},[107,2701,533],{"class":147},[107,2703,1755],{"class":128},[107,2705,1010],{"class":520},[107,2707,1257],{"class":147},[107,2709,2710,2712,2714,2716,2718,2720,2722,2725,2727,2729,2731,2733,2735],{"class":109,"line":1131},[107,2711,2625],{"class":369},[107,2713,133],{"class":132},[107,2715,1959],{"class":369},[107,2717,533],{"class":147},[107,2719,2026],{"class":369},[107,2721,533],{"class":147},[107,2723,2724],{"class":517},"every",[107,2726,521],{"class":520},[107,2728,521],{"class":147},[107,2730,2645],{"class":496},[107,2732,504],{"class":147},[107,2734,507],{"class":124},[107,2736,424],{"class":147},[107,2738,2739,2741,2743,2745,2747,2749,2751,2753],{"class":109,"line":1159},[107,2740,2656],{"class":120},[107,2742,2003],{"class":369},[107,2744,533],{"class":147},[107,2746,2562],{"class":517},[107,2748,521],{"class":520},[107,2750,2645],{"class":369},[107,2752,504],{"class":520},[107,2754,148],{"class":147},[107,2756,2757,2759,2761],{"class":109,"line":1176},[107,2758,2675],{"class":147},[107,2760,504],{"class":520},[107,2762,148],{"class":147},[107,2764,2765],{"class":109,"line":1193},[107,2766,1404],{"class":147},[107,2768,2769,2771,2773,2775,2778,2780,2783,2785,2787,2789,2791,2794,2796,2798,2800,2802,2805,2807],{"class":109,"line":1210},[107,2770,999],{"class":120},[107,2772,493],{"class":520},[107,2774,1004],{"class":132},[107,2776,2777],{"class":369},"result",[107,2779,1010],{"class":520},[107,2781,2782],{"class":120},"throw",[107,2784,1378],{"class":132},[107,2786,688],{"class":517},[107,2788,521],{"class":520},[107,2790,144],{"class":136},[107,2792,2793],{"class":140},"暂无权限访问，请联系管理员",[107,2795,144],{"class":136},[107,2797,527],{"class":147},[107,2799,2271],{"class":369},[107,2801,533],{"class":147},[107,2803,2804],{"class":128},"UNAUTHORIZED",[107,2806,504],{"class":520},[107,2808,148],{"class":147},[107,2810,2811,2813,2815],{"class":109,"line":1216},[107,2812,1410],{"class":120},[107,2814,2588],{"class":369},[107,2816,148],{"class":147},[107,2818,2819],{"class":109,"line":1243},[107,2820,1420],{"class":147},[107,2822,2823],{"class":109,"line":1260},[107,2824,478],{"class":147},[92,2826,1428],{"id":2827},"注册-1",[26,2829,2830,1434],{},[34,2831,1433],{},[99,2833,2835],{"className":101,"code":2834,"language":103,"meta":9,"style":9},"@Module({\n  imports: [],\n  providers: [\n    \u002F\u002F 权限守卫\n    {\n      provide: APP_GUARD,\n      useClass: PermissionGuard,\n    },\n  ]\n})\n",[34,2836,2837,2847,2857,2865,2870,2874,2884,2894,2898,2902],{"__ignoreMap":9},[107,2838,2839,2841,2843,2845],{"class":109,"line":110},[107,2840,795],{"class":147},[107,2842,1446],{"class":517},[107,2844,521],{"class":369},[107,2846,1257],{"class":147},[107,2848,2849,2851,2853,2855],{"class":109,"line":117},[107,2850,1455],{"class":520},[107,2852,839],{"class":147},[107,2854,1460],{"class":369},[107,2856,657],{"class":147},[107,2858,2859,2861,2863],{"class":109,"line":151},[107,2860,1467],{"class":520},[107,2862,839],{"class":147},[107,2864,1472],{"class":369},[107,2866,2867],{"class":109,"line":157},[107,2868,2869],{"class":113},"    \u002F\u002F 权限守卫\n",[107,2871,2872],{"class":109,"line":178},[107,2873,1477],{"class":147},[107,2875,2876,2878,2880,2882],{"class":109,"line":184},[107,2877,1482],{"class":520},[107,2879,839],{"class":147},[107,2881,1487],{"class":128},[107,2883,657],{"class":147},[107,2885,2886,2888,2890,2892],{"class":109,"line":205},[107,2887,1494],{"class":520},[107,2889,839],{"class":147},[107,2891,2305],{"class":369},[107,2893,657],{"class":147},[107,2895,2896],{"class":109,"line":211},[107,2897,1505],{"class":147},[107,2899,2900],{"class":109,"line":232},[107,2901,1510],{"class":369},[107,2903,2904,2906],{"class":109,"line":239},[107,2905,669],{"class":147},[107,2907,1517],{"class":369},[92,2909,1520],{"id":2910},"控制层使用-1",[99,2912,2914],{"className":101,"code":2913,"language":103,"meta":9,"style":9},"import { Controller, Post, Body, Get, Request } from \"@nestjs\u002Fcommon\";\nexport class UserController {\n  constructor() {}\n\n  \u002F\u002F 添加这一行代码。如果没有权限 会提示'暂无权限访问，请联系管理员'\n  @Permission([\"v1:order:create\"], PermissionRelationEnum.OR)\n  @Post(\"create\")\n  async create(@Body() body: { username: string; password: string }) {\n    return \"success\";\n  }\n}\n",[34,2915,2916,2952,2962,2970,2974,2979,3008,3024,3060,3072,3076],{"__ignoreMap":9},[107,2917,2918,2920,2922,2924,2926,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950],{"class":109,"line":110},[107,2919,363],{"class":120},[107,2921,366],{"class":147},[107,2923,1534],{"class":369},[107,2925,527],{"class":147},[107,2927,1539],{"class":369},[107,2929,527],{"class":147},[107,2931,1544],{"class":369},[107,2933,527],{"class":147},[107,2935,1549],{"class":369},[107,2937,527],{"class":147},[107,2939,751],{"class":369},[107,2941,373],{"class":147},[107,2943,376],{"class":120},[107,2945,137],{"class":136},[107,2947,381],{"class":140},[107,2949,144],{"class":136},[107,2951,148],{"class":147},[107,2953,2954,2956,2958,2960],{"class":109,"line":117},[107,2955,121],{"class":120},[107,2957,417],{"class":124},[107,2959,1574],{"class":420},[107,2961,424],{"class":147},[107,2963,2964,2966,2968],{"class":109,"line":151},[107,2965,822],{"class":124},[107,2967,546],{"class":147},[107,2969,894],{"class":147},[107,2971,2972],{"class":109,"line":157},[107,2973,236],{"emptyLinePlaceholder":235},[107,2975,2976],{"class":109,"line":178},[107,2977,2978],{"class":113},"  \u002F\u002F 添加这一行代码。如果没有权限 会提示'暂无权限访问，请联系管理员'\n",[107,2980,2981,2983,2986,2989,2991,2994,2996,2998,3000,3002,3004,3006],{"class":109,"line":184},[107,2982,1598],{"class":147},[107,2984,2985],{"class":517},"Permission",[107,2987,2988],{"class":369},"([",[107,2990,144],{"class":136},[107,2992,2993],{"class":140},"v1:order:create",[107,2995,144],{"class":136},[107,2997,2037],{"class":369},[107,2999,527],{"class":147},[107,3001,1741],{"class":369},[107,3003,533],{"class":147},[107,3005,1771],{"class":128},[107,3007,1517],{"class":369},[107,3009,3010,3012,3014,3016,3018,3020,3022],{"class":109,"line":205},[107,3011,1598],{"class":147},[107,3013,1646],{"class":517},[107,3015,521],{"class":369},[107,3017,144],{"class":136},[107,3019,1653],{"class":140},[107,3021,144],{"class":136},[107,3023,1517],{"class":369},[107,3025,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058],{"class":109,"line":211},[107,3027,900],{"class":124},[107,3029,1664],{"class":903},[107,3031,1667],{"class":147},[107,3033,1670],{"class":517},[107,3035,854],{"class":369},[107,3037,1171],{"class":496},[107,3039,839],{"class":132},[107,3041,366],{"class":147},[107,3043,1681],{"class":429},[107,3045,839],{"class":132},[107,3047,459],{"class":436},[107,3049,446],{"class":147},[107,3051,1690],{"class":429},[107,3053,839],{"class":132},[107,3055,459],{"class":436},[107,3057,1697],{"class":147},[107,3059,424],{"class":147},[107,3061,3062,3064,3066,3068,3070],{"class":109,"line":232},[107,3063,1410],{"class":120},[107,3065,137],{"class":136},[107,3067,1708],{"class":140},[107,3069,144],{"class":136},[107,3071,148],{"class":147},[107,3073,3074],{"class":109,"line":239},[107,3075,1420],{"class":147},[107,3077,3078],{"class":109,"line":245},[107,3079,478],{"class":147},[88,3081,3082],{"id":3082},"是否登录",[92,3084,353],{"id":3085},"自定义元数据-2",[99,3087,3089],{"className":101,"code":3088,"language":103,"meta":9,"style":9},"import { SetMetadata } from \"@nestjs\u002Fcommon\";\nimport { PUBLIC_KEY_METADATA } from \"..\u002Fconstants\u002Fmetadata.constant\";\n\nexport const Public = () => SetMetadata(PUBLIC_KEY_METADATA, true);\n",[34,3090,3091,3111,3131,3135],{"__ignoreMap":9},[107,3092,3093,3095,3097,3099,3101,3103,3105,3107,3109],{"class":109,"line":110},[107,3094,363],{"class":120},[107,3096,366],{"class":147},[107,3098,370],{"class":369},[107,3100,373],{"class":147},[107,3102,376],{"class":120},[107,3104,137],{"class":136},[107,3106,381],{"class":140},[107,3108,144],{"class":136},[107,3110,148],{"class":147},[107,3112,3113,3115,3117,3119,3121,3123,3125,3127,3129],{"class":109,"line":117},[107,3114,363],{"class":120},[107,3116,366],{"class":147},[107,3118,191],{"class":369},[107,3120,373],{"class":147},[107,3122,376],{"class":120},[107,3124,137],{"class":136},[107,3126,402],{"class":140},[107,3128,144],{"class":136},[107,3130,148],{"class":147},[107,3132,3133],{"class":109,"line":151},[107,3134,236],{"emptyLinePlaceholder":235},[107,3136,3137,3139,3141,3144,3146,3149,3151,3153,3155,3158,3160,3162,3164],{"class":109,"line":157},[107,3138,121],{"class":120},[107,3140,125],{"class":124},[107,3142,3143],{"class":487}," Public",[107,3145,133],{"class":132},[107,3147,3148],{"class":147}," ()",[107,3150,507],{"class":124},[107,3152,370],{"class":517},[107,3154,521],{"class":369},[107,3156,3157],{"class":128},"PUBLIC_KEY_METADATA",[107,3159,527],{"class":147},[107,3161,1017],{"class":1016},[107,3163,504],{"class":369},[107,3165,148],{"class":147},[92,3167,564],{"id":3168},"自定义守卫-2",[99,3170,3172],{"className":101,"code":3171,"language":103,"meta":9,"style":9},"import { ExecutionContext, Injectable } from \"@nestjs\u002Fcommon\";\nimport { Observable } from \"rxjs\";\nimport { AuthGuard } from \"@nestjs\u002Fpassport\";\nimport { Reflector } from \"@nestjs\u002Fcore\";\nimport { PUBLIC_KEY_METADATA } from \"..\u002Fconstants\u002Fmetadata.constant\";\nimport { ApiException } from \"..\u002Fexception\u002Fapi.exception\";\nimport { HttpStatusCode } from \"..\u002Fenum\u002Fhttp.enum\";\n\n@Injectable()\n\u002F\u002F https:\u002F\u002Fgithub.com\u002Fjaredhanson\u002Fpassport\nexport class JwtAuthGuard extends AuthGuard(\"jwt\") {\n  constructor(private reflector: Reflector) {\n    super();\n  }\n  canActivate(context: ExecutionContext): boolean | Promise\u003Cboolean> | Observable\u003Cboolean> {\n    const noInterception = this.reflector.getAllAndOverride(PUBLIC_KEY_METADATA, [\n      context.getHandler(),\n      context.getClass(),\n    ]);\n    if (noInterception) return true;\n    return super.canActivate(context);\n  }\n\n  handleRequest(err: any, user: any) {\n    if (err || !user) {\n      throw err || new ApiException(\"登录状态已过期\", HttpStatusCode.FORBIDDEN);\n    }\n    return user;\n  }\n}\n",[34,3173,3174,3198,3218,3240,3260,3280,3300,3320,3324,3332,3337,3364,3382,3391,3395,3435,3462,3474,3486,3493,3510,3530,3534,3538,3565,3583,3619,3623,3631,3635],{"__ignoreMap":9},[107,3175,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196],{"class":109,"line":110},[107,3177,363],{"class":120},[107,3179,366],{"class":147},[107,3181,583],{"class":369},[107,3183,527],{"class":147},[107,3185,588],{"class":369},[107,3187,373],{"class":147},[107,3189,376],{"class":120},[107,3191,137],{"class":136},[107,3193,381],{"class":140},[107,3195,144],{"class":136},[107,3197,148],{"class":147},[107,3199,3200,3202,3204,3206,3208,3210,3212,3214,3216],{"class":109,"line":117},[107,3201,363],{"class":120},[107,3203,366],{"class":147},[107,3205,2168],{"class":369},[107,3207,373],{"class":147},[107,3209,376],{"class":120},[107,3211,137],{"class":136},[107,3213,2177],{"class":140},[107,3215,144],{"class":136},[107,3217,148],{"class":147},[107,3219,3220,3222,3224,3227,3229,3231,3233,3236,3238],{"class":109,"line":151},[107,3221,363],{"class":120},[107,3223,366],{"class":147},[107,3225,3226],{"class":369}," AuthGuard",[107,3228,373],{"class":147},[107,3230,376],{"class":120},[107,3232,137],{"class":136},[107,3234,3235],{"class":140},"@nestjs\u002Fpassport",[107,3237,144],{"class":136},[107,3239,148],{"class":147},[107,3241,3242,3244,3246,3248,3250,3252,3254,3256,3258],{"class":109,"line":157},[107,3243,363],{"class":120},[107,3245,366],{"class":147},[107,3247,609],{"class":369},[107,3249,373],{"class":147},[107,3251,376],{"class":120},[107,3253,137],{"class":136},[107,3255,618],{"class":140},[107,3257,144],{"class":136},[107,3259,148],{"class":147},[107,3261,3262,3264,3266,3268,3270,3272,3274,3276,3278],{"class":109,"line":178},[107,3263,363],{"class":120},[107,3265,366],{"class":147},[107,3267,191],{"class":369},[107,3269,373],{"class":147},[107,3271,376],{"class":120},[107,3273,137],{"class":136},[107,3275,402],{"class":140},[107,3277,144],{"class":136},[107,3279,148],{"class":147},[107,3281,3282,3284,3286,3288,3290,3292,3294,3296,3298],{"class":109,"line":184},[107,3283,363],{"class":120},[107,3285,366],{"class":147},[107,3287,688],{"class":369},[107,3289,373],{"class":147},[107,3291,376],{"class":120},[107,3293,137],{"class":136},[107,3295,697],{"class":140},[107,3297,144],{"class":136},[107,3299,148],{"class":147},[107,3301,3302,3304,3306,3308,3310,3312,3314,3316,3318],{"class":109,"line":205},[107,3303,363],{"class":120},[107,3305,366],{"class":147},[107,3307,2271],{"class":369},[107,3309,373],{"class":147},[107,3311,376],{"class":120},[107,3313,137],{"class":136},[107,3315,2280],{"class":140},[107,3317,144],{"class":136},[107,3319,148],{"class":147},[107,3321,3322],{"class":109,"line":211},[107,3323,236],{"emptyLinePlaceholder":235},[107,3325,3326,3328,3330],{"class":109,"line":232},[107,3327,795],{"class":147},[107,3329,798],{"class":517},[107,3331,801],{"class":369},[107,3333,3334],{"class":109,"line":239},[107,3335,3336],{"class":113},"\u002F\u002F https:\u002F\u002Fgithub.com\u002Fjaredhanson\u002Fpassport\n",[107,3338,3339,3341,3343,3346,3349,3351,3353,3355,3358,3360,3362],{"class":109,"line":245},[107,3340,121],{"class":120},[107,3342,417],{"class":124},[107,3344,3345],{"class":420}," JwtAuthGuard",[107,3347,3348],{"class":124}," extends",[107,3350,3226],{"class":517},[107,3352,521],{"class":369},[107,3354,144],{"class":136},[107,3356,3357],{"class":140},"jwt",[107,3359,144],{"class":136},[107,3361,1010],{"class":369},[107,3363,1257],{"class":147},[107,3365,3366,3368,3370,3372,3374,3376,3378,3380],{"class":109,"line":251},[107,3367,822],{"class":124},[107,3369,521],{"class":147},[107,3371,857],{"class":124},[107,3373,836],{"class":496},[107,3375,839],{"class":132},[107,3377,609],{"class":420},[107,3379,504],{"class":147},[107,3381,424],{"class":147},[107,3383,3384,3387,3389],{"class":109,"line":272},[107,3385,3386],{"class":128},"    super",[107,3388,546],{"class":520},[107,3390,148],{"class":147},[107,3392,3393],{"class":109,"line":278},[107,3394,1420],{"class":147},[107,3396,3397,3399,3401,3403,3405,3407,3409,3411,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431,3433],{"class":109,"line":299},[107,3398,2336],{"class":903},[107,3400,521],{"class":147},[107,3402,909],{"class":496},[107,3404,839],{"class":132},[107,3406,583],{"class":420},[107,3408,504],{"class":147},[107,3410,839],{"class":132},[107,3412,2351],{"class":436},[107,3414,1915],{"class":132},[107,3416,920],{"class":420},[107,3418,923],{"class":147},[107,3420,926],{"class":436},[107,3422,929],{"class":147},[107,3424,1915],{"class":132},[107,3426,2168],{"class":420},[107,3428,923],{"class":147},[107,3430,926],{"class":436},[107,3432,929],{"class":147},[107,3434,424],{"class":147},[107,3436,3437,3439,3442,3444,3446,3448,3450,3452,3454,3456,3458,3460],{"class":109,"line":305},[107,3438,937],{"class":124},[107,3440,3441],{"class":128}," noInterception",[107,3443,133],{"class":132},[107,3445,950],{"class":949},[107,3447,533],{"class":147},[107,3449,955],{"class":369},[107,3451,533],{"class":147},[107,3453,2392],{"class":517},[107,3455,521],{"class":520},[107,3457,3157],{"class":128},[107,3459,527],{"class":147},[107,3461,1472],{"class":520},[107,3463,3464,3466,3468,3470,3472],{"class":109,"line":326},[107,3465,976],{"class":369},[107,3467,533],{"class":147},[107,3469,981],{"class":517},[107,3471,546],{"class":520},[107,3473,657],{"class":147},[107,3475,3476,3478,3480,3482,3484],{"class":109,"line":332},[107,3477,976],{"class":369},[107,3479,533],{"class":147},[107,3481,2430],{"class":517},[107,3483,546],{"class":520},[107,3485,657],{"class":147},[107,3487,3488,3491],{"class":109,"line":872},[107,3489,3490],{"class":520},"    ])",[107,3492,148],{"class":147},[107,3494,3495,3497,3499,3502,3504,3506,3508],{"class":109,"line":888},[107,3496,999],{"class":120},[107,3498,493],{"class":520},[107,3500,3501],{"class":369},"noInterception",[107,3503,1010],{"class":520},[107,3505,1013],{"class":120},[107,3507,1017],{"class":1016},[107,3509,148],{"class":147},[107,3511,3512,3514,3517,3519,3522,3524,3526,3528],{"class":109,"line":897},[107,3513,1410],{"class":120},[107,3515,3516],{"class":128}," super",[107,3518,533],{"class":147},[107,3520,3521],{"class":517},"canActivate",[107,3523,521],{"class":520},[107,3525,909],{"class":369},[107,3527,504],{"class":520},[107,3529,148],{"class":147},[107,3531,3532],{"class":109,"line":934},[107,3533,1420],{"class":147},[107,3535,3536],{"class":109,"line":965},[107,3537,236],{"emptyLinePlaceholder":235},[107,3539,3540,3543,3545,3548,3550,3553,3555,3557,3559,3561,3563],{"class":109,"line":973},[107,3541,3542],{"class":903},"  handleRequest",[107,3544,521],{"class":147},[107,3546,3547],{"class":496},"err",[107,3549,839],{"class":132},[107,3551,3552],{"class":436}," any",[107,3554,527],{"class":147},[107,3556,2517],{"class":496},[107,3558,839],{"class":132},[107,3560,3552],{"class":436},[107,3562,504],{"class":147},[107,3564,424],{"class":147},[107,3566,3567,3569,3571,3573,3575,3577,3579,3581],{"class":109,"line":988},[107,3568,999],{"class":120},[107,3570,493],{"class":520},[107,3572,3547],{"class":369},[107,3574,2455],{"class":132},[107,3576,2458],{"class":132},[107,3578,2526],{"class":369},[107,3580,1010],{"class":520},[107,3582,1257],{"class":147},[107,3584,3585,3588,3591,3593,3595,3597,3599,3601,3604,3606,3608,3610,3612,3615,3617],{"class":109,"line":996},[107,3586,3587],{"class":120},"      throw",[107,3589,3590],{"class":369}," err",[107,3592,2455],{"class":132},[107,3594,1378],{"class":132},[107,3596,688],{"class":517},[107,3598,521],{"class":520},[107,3600,144],{"class":136},[107,3602,3603],{"class":140},"登录状态已过期",[107,3605,144],{"class":136},[107,3607,527],{"class":147},[107,3609,2271],{"class":369},[107,3611,533],{"class":147},[107,3613,3614],{"class":128},"FORBIDDEN",[107,3616,504],{"class":520},[107,3618,148],{"class":147},[107,3620,3621],{"class":109,"line":1022},[107,3622,1404],{"class":147},[107,3624,3625,3627,3629],{"class":109,"line":1055},[107,3626,1410],{"class":120},[107,3628,2517],{"class":369},[107,3630,148],{"class":147},[107,3632,3633],{"class":109,"line":1086},[107,3634,1420],{"class":147},[107,3636,3637],{"class":109,"line":1119},[107,3638,478],{"class":147},[92,3640,1428],{"id":3641},"注册-2",[26,3643,3644,1434],{},[34,3645,1433],{},[99,3647,3649],{"className":101,"code":3648,"language":103,"meta":9,"style":9},"@Module({\n  imports: [],\n  providers: [\n    \u002F\u002F jwt守卫\n    {\n      provide: APP_GUARD,\n      useClass: JwtAuthGuard,\n    },\n  ]\n})\n",[34,3650,3651,3661,3671,3679,3684,3688,3698,3708,3712,3716],{"__ignoreMap":9},[107,3652,3653,3655,3657,3659],{"class":109,"line":110},[107,3654,795],{"class":147},[107,3656,1446],{"class":517},[107,3658,521],{"class":369},[107,3660,1257],{"class":147},[107,3662,3663,3665,3667,3669],{"class":109,"line":117},[107,3664,1455],{"class":520},[107,3666,839],{"class":147},[107,3668,1460],{"class":369},[107,3670,657],{"class":147},[107,3672,3673,3675,3677],{"class":109,"line":151},[107,3674,1467],{"class":520},[107,3676,839],{"class":147},[107,3678,1472],{"class":369},[107,3680,3681],{"class":109,"line":157},[107,3682,3683],{"class":113},"    \u002F\u002F jwt守卫\n",[107,3685,3686],{"class":109,"line":178},[107,3687,1477],{"class":147},[107,3689,3690,3692,3694,3696],{"class":109,"line":184},[107,3691,1482],{"class":520},[107,3693,839],{"class":147},[107,3695,1487],{"class":128},[107,3697,657],{"class":147},[107,3699,3700,3702,3704,3706],{"class":109,"line":205},[107,3701,1494],{"class":520},[107,3703,839],{"class":147},[107,3705,3345],{"class":369},[107,3707,657],{"class":147},[107,3709,3710],{"class":109,"line":211},[107,3711,1505],{"class":147},[107,3713,3714],{"class":109,"line":232},[107,3715,1510],{"class":369},[107,3717,3718,3720],{"class":109,"line":239},[107,3719,669],{"class":147},[107,3721,1517],{"class":369},[92,3723,1520],{"id":3724},"控制层使用-2",[99,3726,3728],{"className":101,"code":3727,"language":103,"meta":9,"style":9},"import { Controller, Post, Body, Get, Request } from \"@nestjs\u002Fcommon\";\nexport class UserController {\n  constructor() {}\n\n  \u002F\u002F 添加这一行代码。说明不需要token校验\n  @Public()\n  @Post(\"create\")\n  async create(@Body() body: { username: string; password: string }) {\n    return \"success\";\n  }\n}\n",[34,3729,3730,3766,3776,3784,3788,3793,3802,3818,3854,3866,3870],{"__ignoreMap":9},[107,3731,3732,3734,3736,3738,3740,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764],{"class":109,"line":110},[107,3733,363],{"class":120},[107,3735,366],{"class":147},[107,3737,1534],{"class":369},[107,3739,527],{"class":147},[107,3741,1539],{"class":369},[107,3743,527],{"class":147},[107,3745,1544],{"class":369},[107,3747,527],{"class":147},[107,3749,1549],{"class":369},[107,3751,527],{"class":147},[107,3753,751],{"class":369},[107,3755,373],{"class":147},[107,3757,376],{"class":120},[107,3759,137],{"class":136},[107,3761,381],{"class":140},[107,3763,144],{"class":136},[107,3765,148],{"class":147},[107,3767,3768,3770,3772,3774],{"class":109,"line":117},[107,3769,121],{"class":120},[107,3771,417],{"class":124},[107,3773,1574],{"class":420},[107,3775,424],{"class":147},[107,3777,3778,3780,3782],{"class":109,"line":151},[107,3779,822],{"class":124},[107,3781,546],{"class":147},[107,3783,894],{"class":147},[107,3785,3786],{"class":109,"line":157},[107,3787,236],{"emptyLinePlaceholder":235},[107,3789,3790],{"class":109,"line":178},[107,3791,3792],{"class":113},"  \u002F\u002F 添加这一行代码。说明不需要token校验\n",[107,3794,3795,3797,3800],{"class":109,"line":184},[107,3796,1598],{"class":147},[107,3798,3799],{"class":517},"Public",[107,3801,801],{"class":369},[107,3803,3804,3806,3808,3810,3812,3814,3816],{"class":109,"line":205},[107,3805,1598],{"class":147},[107,3807,1646],{"class":517},[107,3809,521],{"class":369},[107,3811,144],{"class":136},[107,3813,1653],{"class":140},[107,3815,144],{"class":136},[107,3817,1517],{"class":369},[107,3819,3820,3822,3824,3826,3828,3830,3832,3834,3836,3838,3840,3842,3844,3846,3848,3850,3852],{"class":109,"line":211},[107,3821,900],{"class":124},[107,3823,1664],{"class":903},[107,3825,1667],{"class":147},[107,3827,1670],{"class":517},[107,3829,854],{"class":369},[107,3831,1171],{"class":496},[107,3833,839],{"class":132},[107,3835,366],{"class":147},[107,3837,1681],{"class":429},[107,3839,839],{"class":132},[107,3841,459],{"class":436},[107,3843,446],{"class":147},[107,3845,1690],{"class":429},[107,3847,839],{"class":132},[107,3849,459],{"class":436},[107,3851,1697],{"class":147},[107,3853,424],{"class":147},[107,3855,3856,3858,3860,3862,3864],{"class":109,"line":232},[107,3857,1410],{"class":120},[107,3859,137],{"class":136},[107,3861,1708],{"class":140},[107,3863,144],{"class":136},[107,3865,148],{"class":147},[107,3867,3868],{"class":109,"line":239},[107,3869,1420],{"class":147},[107,3871,3872],{"class":109,"line":245},[107,3873,478],{"class":147},[26,3875,3876],{},"注意：",[3878,3879,3880,3890,3896],"ol",{},[3881,3882,3883],"li",{},[39,3884,3886,3887],{"href":3885},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BC%82%E5%B8%B8","自定义异常 ",[34,3888,3889],{},"ApiException",[3881,3891,3892],{},[39,3893,3895],{"href":3894},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdatabase#redis","Redis 配置",[3881,3897,3898],{},[39,3899,3901],{"href":3900},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fjwt%E6%8E%88%E6%9D%83","JWT 授权",[88,3903,3904],{"id":3904},"参考文献",[3906,3907,3908,3921],"table",{},[3909,3910,3911],"thead",{},[3912,3913,3914,3918],"tr",{},[3915,3916,3917],"th",{},"资料",[3915,3919,3920],{},"说明",[3922,3923,3924,3938,3950],"tbody",{},[3912,3925,3926,3935],{},[3927,3928,3929],"td",{},[39,3930,3934],{"href":3931,"rel":3932},"https:\u002F\u002Fdocs.nestjs.com\u002Fguards",[3933],"nofollow","Guards",[3927,3936,3937],{},"官方",[3912,3939,3940,3947],{},[3927,3941,3942],{},[39,3943,3946],{"href":3944,"rel":3945},"https:\u002F\u002Fdocs.nestjs.com\u002Fsecurity\u002Fauthentication",[3933],"Passport",[3927,3948,3949],{},"认证",[3912,3951,3952,3956],{},[3927,3953,3954],{},[39,3955,42],{"href":41},[3927,3957,3958],{},"主线教程",[3960,3961,3962],"style",{},"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 .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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .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 .sVXei, html code.shiki .sVXei{--shiki-light:#E53935;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":9,"searchDepth":117,"depth":117,"links":3964},[3965,3972,3978,3984],{"id":90,"depth":117,"text":90,"children":3966},[3967,3968,3969,3970,3971],{"id":94,"depth":151,"text":94},{"id":353,"depth":151,"text":353},{"id":564,"depth":151,"text":564},{"id":1428,"depth":151,"text":1428},{"id":1520,"depth":151,"text":1520},{"id":1723,"depth":117,"text":1723,"children":3973},[3974,3975,3976,3977],{"id":1726,"depth":151,"text":353},{"id":2106,"depth":151,"text":564},{"id":2827,"depth":151,"text":1428},{"id":2910,"depth":151,"text":1520},{"id":3082,"depth":117,"text":3082,"children":3979},[3980,3981,3982,3983],{"id":3085,"depth":151,"text":353},{"id":3168,"depth":151,"text":564},{"id":3641,"depth":151,"text":1428},{"id":3724,"depth":151,"text":1520},{"id":3904,"depth":117,"text":3904},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FNestJS\u002Fbefore\u002Fnext","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FNestJS\u002Fbefore\u002Fnext.md","md",{"items":3990},[3991,3994,3997,4000,4004,4007],{"path":3992,"title":3993,"description":9,"category":10,"score":184},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce","异常处理器",{"path":3995,"title":3996,"description":9,"category":10,"score":184},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fenv","环境加载",{"path":3998,"title":3999,"description":9,"category":10,"score":184},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdatabase","数据库的配置",{"path":4001,"title":4002,"description":4003,"category":10,"score":184},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Finfo","归档说明（before\u002F）","本目录（before\u002F）为早期 NestJS 实战笔记：以完整业务片段（守卫、拦截器、MongoDB、JWT 等）为主，写法与文件命名不统一。新项目请跟 new\u002F 主线，技术细节以 docs.nestjs.com 为准。",{"path":4005,"title":4006,"description":9,"category":10,"score":184},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fitc","统一响应格式拦截器",{"path":4008,"title":4009,"description":9,"category":10,"score":184},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdemo","入手Demo",{"series":4011,"title":4012,"items":4013,"index":232,"prev":4043,"next":4044},"booklet\u002Fend\u002Fnestjs\u002Fbefore","before",[4014,4016,4018,4020,4022,4024,4028,4030,4034,4038,4039],{"path":3998,"title":3999,"date":4015,"pinned":15},"2024-06-22",{"path":4008,"title":4009,"date":4017,"pinned":15},"2022-10-15",{"path":3995,"title":3996,"date":4019,"pinned":15},"2024-09-01",{"path":3992,"title":3993,"date":4021,"pinned":15},"2026-03-17",{"path":4001,"title":4002,"date":4023,"pinned":15},"2023-08-31",{"path":4025,"title":4026,"date":4027,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Finjectable","操作日志拦截器","2020-02-20",{"path":4005,"title":4006,"date":4029,"pinned":15},"2023-08-17",{"path":4031,"title":4032,"date":4033,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fjwt","JWT 与 Passport 授权","2021-08-10",{"path":4035,"title":4036,"date":4037,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fmi","Nest 中间件","2022-06-21",{"path":7,"title":8,"date":14,"pinned":15},{"path":4040,"title":4041,"date":4042,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fother","其他配置","2022-05-23",{"path":4035,"title":4036,"date":4037,"pinned":15},{"path":4040,"title":4041,"date":4042,"pinned":15}]