[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce":2684,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce":2705},{"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":2680,"stem":2681,"id":2682,"extension":2683},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fexce","异常处理器","","技能小册",[12,13],"nestjs","exce","2026-03-17",false,{"type":17,"value":18,"toc":2672},"minimark",[19,22,44,52,123,127,138,219,225,279,282,1502,1505,1513,2207,2517,2521,2528,2612,2615,2668],[20,21,8],"h1",{"id":8},[23,24,25],"blockquote",{},[26,27,28,32,33,38,39,43],"p",{},[29,30,31],"strong",{},"归档","：请优先阅读 ",[34,35,37],"a",{"href":36},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs","NestJS 导读"," 与 ",[34,40,42],{"href":41},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fnew\u002Fbase","new\u002F 主线","。",[23,45,46,49],{},[26,47,48],{},"Nest 带有一个内置的异常层，负责处理应用中所有未处理的异常。当你的应用代码未处理异常时，该层会捕获该异常，然后自动发送适当的用户友好响应。",[26,50,51],{},"开箱即用，此操作由内置的全局异常过滤器执行，该过滤器处理 HttpException 类型（及其子类）的异常。当异常无法识别时（既不是 HttpException 也不是继承自 HttpException 的类），内置异常过滤器会生成以下默认 JSON 响应：",[53,54,58],"pre",{"className":55,"code":56,"language":57,"meta":9,"style":9},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"statusCode\": 500,\n  \"message\": \"Internal server error\"\n}\n","json",[59,60,61,70,94,117],"code",{"__ignoreMap":9},[62,63,66],"span",{"class":64,"line":65},"line",1,[62,67,69],{"class":68},"sP7_E","{\n",[62,71,73,77,81,84,87,91],{"class":64,"line":72},2,[62,74,76],{"class":75},"s39Yj","  \"",[62,78,80],{"class":79},"sseR_","statusCode",[62,82,83],{"class":75},"\"",[62,85,86],{"class":68},":",[62,88,90],{"class":89},"srdBf"," 500",[62,92,93],{"class":68},",\n",[62,95,97,99,102,104,106,110,114],{"class":64,"line":96},3,[62,98,76],{"class":75},[62,100,101],{"class":79},"message",[62,103,83],{"class":75},[62,105,86],{"class":68},[62,107,109],{"class":108},"sjJ54"," \"",[62,111,113],{"class":112},"s_sjI","Internal server error",[62,115,116],{"class":108},"\"\n",[62,118,120],{"class":64,"line":119},4,[62,121,122],{"class":68},"}\n",[124,125,126],"h2",{"id":126},"内置异常",[26,128,129,130,133,134,137],{},"例如，在 ",[59,131,132],{},"CatsController"," 中，我们有一个 ",[59,135,136],{},"findAll()"," 方法（一个 GET 路由处理程序）。假设此路由处理程序出于某种原因抛出异常。为了证明这一点，我们将硬编码如下：",[53,139,143],{"className":140,"code":141,"language":142,"meta":9,"style":9},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","@Get()\nasync findAll() {\n  throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);\n}\n","ts",[59,144,145,158,171,215],{"__ignoreMap":9},[62,146,147,150,154],{"class":64,"line":65},[62,148,149],{"class":68},"@",[62,151,153],{"class":152},"sGLFI","Get",[62,155,157],{"class":156},"su5hD","()\n",[62,159,160,163,166,169],{"class":64,"line":72},[62,161,162],{"class":156},"async ",[62,164,165],{"class":152},"findAll",[62,167,168],{"class":156},"() ",[62,170,69],{"class":68},[62,172,173,177,181,184,188,191,194,196,199,202,205,209,212],{"class":64,"line":96},[62,174,176],{"class":175},"sVHd0","  throw",[62,178,180],{"class":179},"smGrS"," new",[62,182,183],{"class":152}," HttpException",[62,185,187],{"class":186},"skxfh","(",[62,189,190],{"class":108},"'",[62,192,193],{"class":112},"Forbidden",[62,195,190],{"class":108},[62,197,198],{"class":68},",",[62,200,201],{"class":156}," HttpStatus",[62,203,204],{"class":68},".",[62,206,208],{"class":207},"s_hVV","FORBIDDEN",[62,210,211],{"class":186},")",[62,213,214],{"class":68},";\n",[62,216,217],{"class":64,"line":119},[62,218,122],{"class":68},[26,220,221,224],{},[59,222,223],{},"HttpException","参数说明:",[226,227,228,239,251],"ul",{},[229,230,231,234,235,238],"li",{},[59,232,233],{},"response"," 参数定义 JSON 响应主体。它可以是 ",[59,236,237],{},"string 或 object","，如下所述。",[229,240,241,244,245,43],{},[59,242,243],{},"status"," 参数定义了 ",[34,246,250],{"href":247,"rel":248},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FHTTP\u002FStatus",[249],"nofollow","HTTP 状态代码",[229,252,253,254],{},"默认情况下，JSON 响应主体包含两个属性：\n",[226,255,256,268],{},[229,257,258,260,261,263,264,267],{},[59,259,80],{},"：默认为 ",[59,262,243],{}," 参数中提供的 ",[59,265,266],{},"HTTP"," 状态代码",[229,269,270,272,273,275,276,278],{},[59,271,101],{},"：基于 ",[59,274,243],{}," 的 ",[59,277,266],{}," 错误的简短描述",[124,280,281],{"id":281},"自定义异常",[53,283,285],{"className":140,"code":284,"language":142,"meta":9,"style":9},"\u002F\u002F 常用的状态枚举\nexport enum HttpStatusCode {\n  \u002F\u002F 2xx 状态码表示请求已成功处理\n  OK = 200, \u002F\u002F 请求成功\n  CREATED = 201, \u002F\u002F 请求已成功创建新的资源\n  ACCEPTED = 202, \u002F\u002F 请求已经接受，但未处理完成\n  NO_CONTENT = 204, \u002F\u002F 服务器已成功处理请求，但没有返回任何内容\n  PARTIAL_CONTENT = 206, \u002F\u002F 服务器已成功处理了部分范围请求\n\n  \u002F\u002F 3xx 状态码表示重定向\n  MULTIPLE_CHOICES = 300, \u002F\u002F 请求的目标有多个重定向地址\n  MOVED_PERMANENTLY = 301, \u002F\u002F 请求的资源已被永久移动到新的URI\n  FOUND = 302, \u002F\u002F 请求的资源临时移动到新的URI\n  SEE_OTHER = 303, \u002F\u002F 临时重定向，且应使用GET方法获取新的URI\n  NOT_MODIFIED = 304, \u002F\u002F 自上次请求以来，请求的资源未修改\n  USE_PROXY = 305, \u002F\u002F 访问资源应通过代理进行\n  TEMPORARY_REDIRECT = 307, \u002F\u002F 临时重定向\n  PERMANENT_REDIRECT = 308, \u002F\u002F 永久重定向\n\n  \u002F\u002F 4xx 状态码表示客户端错误\n  BAD_REQUEST = 400, \u002F\u002F 请求的语法错误或请求无法理解\n  UNAUTHORIZED = 401, \u002F\u002F 未授权访问\n  PAYMENT_REQUIRED = 402, \u002F\u002F 暂未使用，保留给将来可能的需求\n  FORBIDDEN = 403, \u002F\u002F 客户端没有足够的权限访问请求的资源\n  NOT_FOUND = 404, \u002F\u002F 未找到请求的资源\n  METHOD_NOT_ALLOWED = 405, \u002F\u002F 不允许使用此方法请求资源\n  NOT_ACCEPTABLE = 406, \u002F\u002F 无法使用请求的内容特性响应请求\n  PROXY_AUTHENTICATION_REQUIRED = 407, \u002F\u002F 通过代理服务器访问资源需要进行代理认证\n  REQUEST_TIMEOUT = 408, \u002F\u002F 请求超时\n  CONFLICT = 409, \u002F\u002F 请求的资源存在冲突\n\n  \u002F\u002F 更多的4xx状态码，表示客户端错误\n  GONE = 410, \u002F\u002F 之前可用的资源现已不可用，且将来也不会可用\n  LENGTH_REQUIRED = 411, \u002F\u002F 服务器拒绝在没有定义Content-Length头的情况下接受请求\n  PRECONDITION_FAILED = 412, \u002F\u002F 请求头中给出的条件不满足\n  PAYLOAD_TOO_LARGE = 413, \u002F\u002F 请求的实体太大\n  URI_TOO_LONG = 414, \u002F\u002F 请求的URI太长\n  UNSUPPORTED_MEDIA_TYPE = 415, \u002F\u002F 请求的媒体类型不受支持\n  RANGE_NOT_SATISFIABLE = 416, \u002F\u002F 请求的范围无效\n  EXPECTATION_FAILED = 417, \u002F\u002F 服务器无法满足期望头字段的要求\n\n  UNPROCESSABLE_ENTITY = 422, \u002F\u002F 请求的实体不可处理但可能是有效的\n  TOO_MANY_REQUESTS = 429, \u002F\u002F 发起的请求太多，太频繁\n\n  \u002F\u002F 5xx 状态码表示服务器错误\n  INTERNAL_SERVER_ERROR = 500, \u002F\u002F 服务器发生内部错误\n  NOT_IMPLEMENTED = 501, \u002F\u002F 服务器不支持请求的方法\n  BAD_GATEWAY = 502, \u002F\u002F 服务器作为网关或代理，从上游服务器收到无效响应\n  SERVICE_UNAVAILABLE = 503, \u002F\u002F 服务器目前无法使用（由于临时过载或维护）\n  GATEWAY_TIMEOUT = 504, \u002F\u002F 服务器作为网关或代理，但是没有及时从上游服务器收到请求\n  HTTP_VERSION_NOT_SUPPORTED = 505, \u002F\u002F 服务器不支持请求使用的HTTP版本\n\n  \u002F\u002F 表示未知的状态码\n  UNKNOWN = 999,\n}\n\nimport { HttpException } from \"@nestjs\u002Fcommon\";\nimport { HttpStatusCode } from \"..\u002Fenum\u002Fhttp.enum\";\n\nexport class ApiException extends HttpException {\n  private errCode: number;\n  constructor(msg: string | Record\u003Cstring, any>, errCode: HttpStatusCode = HttpStatusCode.OK) {\n    switch (errCode) {\n      \u002F\u002F 没有权限访问\n      case HttpStatusCode.UNAUTHORIZED:\n        super(msg, HttpStatusCode.OK);\n        this.errCode = HttpStatusCode.UNAUTHORIZED;\n        break;\n      \u002F\u002F 登录失效\n      case HttpStatusCode.FORBIDDEN:\n        super(msg, HttpStatusCode.OK);\n        this.errCode = HttpStatusCode.FORBIDDEN;\n        break;\n      \u002F\u002F 资源不存在， 验证码，接口地址，图片资源等等\n      case HttpStatusCode.NOT_FOUND:\n        super(msg, HttpStatusCode.OK);\n        this.errCode = HttpStatusCode.NOT_FOUND;\n        break;\n      \u002F\u002F 其他归于服务器内部错误\n      default:\n        super(msg, errCode ?? HttpStatusCode.OK);\n        this.errCode = HttpStatusCode.INTERNAL_SERVER_ERROR;\n    }\n  }\n  getErrCode(): number {\n    return this.errCode;\n  }\n}\n",[59,286,287,293,309,314,330,346,362,378,394,401,407,423,439,455,471,487,503,519,535,540,546,562,578,594,610,626,642,658,674,690,706,711,717,733,749,765,781,797,813,829,845,850,866,882,887,893,908,924,940,956,972,988,993,999,1012,1017,1022,1048,1070,1075,1093,1111,1167,1184,1190,1206,1228,1248,1256,1262,1275,1296,1315,1322,1328,1342,1363,1382,1389,1395,1403,1429,1449,1455,1461,1477,1492,1497],{"__ignoreMap":9},[62,288,289],{"class":64,"line":65},[62,290,292],{"class":291},"sutJx","\u002F\u002F 常用的状态枚举\n",[62,294,295,298,302,306],{"class":64,"line":72},[62,296,297],{"class":175},"export",[62,299,301],{"class":300},"sbsja"," enum",[62,303,305],{"class":304},"sbgvK"," HttpStatusCode",[62,307,308],{"class":68}," {\n",[62,310,311],{"class":64,"line":96},[62,312,313],{"class":291},"  \u002F\u002F 2xx 状态码表示请求已成功处理\n",[62,315,316,319,322,325,327],{"class":64,"line":119},[62,317,318],{"class":207},"  OK",[62,320,321],{"class":179}," =",[62,323,324],{"class":89}," 200",[62,326,198],{"class":68},[62,328,329],{"class":291}," \u002F\u002F 请求成功\n",[62,331,333,336,338,341,343],{"class":64,"line":332},5,[62,334,335],{"class":207},"  CREATED",[62,337,321],{"class":179},[62,339,340],{"class":89}," 201",[62,342,198],{"class":68},[62,344,345],{"class":291}," \u002F\u002F 请求已成功创建新的资源\n",[62,347,349,352,354,357,359],{"class":64,"line":348},6,[62,350,351],{"class":207},"  ACCEPTED",[62,353,321],{"class":179},[62,355,356],{"class":89}," 202",[62,358,198],{"class":68},[62,360,361],{"class":291}," \u002F\u002F 请求已经接受，但未处理完成\n",[62,363,365,368,370,373,375],{"class":64,"line":364},7,[62,366,367],{"class":207},"  NO_CONTENT",[62,369,321],{"class":179},[62,371,372],{"class":89}," 204",[62,374,198],{"class":68},[62,376,377],{"class":291}," \u002F\u002F 服务器已成功处理请求，但没有返回任何内容\n",[62,379,381,384,386,389,391],{"class":64,"line":380},8,[62,382,383],{"class":207},"  PARTIAL_CONTENT",[62,385,321],{"class":179},[62,387,388],{"class":89}," 206",[62,390,198],{"class":68},[62,392,393],{"class":291}," \u002F\u002F 服务器已成功处理了部分范围请求\n",[62,395,397],{"class":64,"line":396},9,[62,398,400],{"emptyLinePlaceholder":399},true,"\n",[62,402,404],{"class":64,"line":403},10,[62,405,406],{"class":291},"  \u002F\u002F 3xx 状态码表示重定向\n",[62,408,410,413,415,418,420],{"class":64,"line":409},11,[62,411,412],{"class":207},"  MULTIPLE_CHOICES",[62,414,321],{"class":179},[62,416,417],{"class":89}," 300",[62,419,198],{"class":68},[62,421,422],{"class":291}," \u002F\u002F 请求的目标有多个重定向地址\n",[62,424,426,429,431,434,436],{"class":64,"line":425},12,[62,427,428],{"class":207},"  MOVED_PERMANENTLY",[62,430,321],{"class":179},[62,432,433],{"class":89}," 301",[62,435,198],{"class":68},[62,437,438],{"class":291}," \u002F\u002F 请求的资源已被永久移动到新的URI\n",[62,440,442,445,447,450,452],{"class":64,"line":441},13,[62,443,444],{"class":207},"  FOUND",[62,446,321],{"class":179},[62,448,449],{"class":89}," 302",[62,451,198],{"class":68},[62,453,454],{"class":291}," \u002F\u002F 请求的资源临时移动到新的URI\n",[62,456,458,461,463,466,468],{"class":64,"line":457},14,[62,459,460],{"class":207},"  SEE_OTHER",[62,462,321],{"class":179},[62,464,465],{"class":89}," 303",[62,467,198],{"class":68},[62,469,470],{"class":291}," \u002F\u002F 临时重定向，且应使用GET方法获取新的URI\n",[62,472,474,477,479,482,484],{"class":64,"line":473},15,[62,475,476],{"class":207},"  NOT_MODIFIED",[62,478,321],{"class":179},[62,480,481],{"class":89}," 304",[62,483,198],{"class":68},[62,485,486],{"class":291}," \u002F\u002F 自上次请求以来，请求的资源未修改\n",[62,488,490,493,495,498,500],{"class":64,"line":489},16,[62,491,492],{"class":207},"  USE_PROXY",[62,494,321],{"class":179},[62,496,497],{"class":89}," 305",[62,499,198],{"class":68},[62,501,502],{"class":291}," \u002F\u002F 访问资源应通过代理进行\n",[62,504,506,509,511,514,516],{"class":64,"line":505},17,[62,507,508],{"class":207},"  TEMPORARY_REDIRECT",[62,510,321],{"class":179},[62,512,513],{"class":89}," 307",[62,515,198],{"class":68},[62,517,518],{"class":291}," \u002F\u002F 临时重定向\n",[62,520,522,525,527,530,532],{"class":64,"line":521},18,[62,523,524],{"class":207},"  PERMANENT_REDIRECT",[62,526,321],{"class":179},[62,528,529],{"class":89}," 308",[62,531,198],{"class":68},[62,533,534],{"class":291}," \u002F\u002F 永久重定向\n",[62,536,538],{"class":64,"line":537},19,[62,539,400],{"emptyLinePlaceholder":399},[62,541,543],{"class":64,"line":542},20,[62,544,545],{"class":291},"  \u002F\u002F 4xx 状态码表示客户端错误\n",[62,547,549,552,554,557,559],{"class":64,"line":548},21,[62,550,551],{"class":207},"  BAD_REQUEST",[62,553,321],{"class":179},[62,555,556],{"class":89}," 400",[62,558,198],{"class":68},[62,560,561],{"class":291}," \u002F\u002F 请求的语法错误或请求无法理解\n",[62,563,565,568,570,573,575],{"class":64,"line":564},22,[62,566,567],{"class":207},"  UNAUTHORIZED",[62,569,321],{"class":179},[62,571,572],{"class":89}," 401",[62,574,198],{"class":68},[62,576,577],{"class":291}," \u002F\u002F 未授权访问\n",[62,579,581,584,586,589,591],{"class":64,"line":580},23,[62,582,583],{"class":207},"  PAYMENT_REQUIRED",[62,585,321],{"class":179},[62,587,588],{"class":89}," 402",[62,590,198],{"class":68},[62,592,593],{"class":291}," \u002F\u002F 暂未使用，保留给将来可能的需求\n",[62,595,597,600,602,605,607],{"class":64,"line":596},24,[62,598,599],{"class":207},"  FORBIDDEN",[62,601,321],{"class":179},[62,603,604],{"class":89}," 403",[62,606,198],{"class":68},[62,608,609],{"class":291}," \u002F\u002F 客户端没有足够的权限访问请求的资源\n",[62,611,613,616,618,621,623],{"class":64,"line":612},25,[62,614,615],{"class":207},"  NOT_FOUND",[62,617,321],{"class":179},[62,619,620],{"class":89}," 404",[62,622,198],{"class":68},[62,624,625],{"class":291}," \u002F\u002F 未找到请求的资源\n",[62,627,629,632,634,637,639],{"class":64,"line":628},26,[62,630,631],{"class":207},"  METHOD_NOT_ALLOWED",[62,633,321],{"class":179},[62,635,636],{"class":89}," 405",[62,638,198],{"class":68},[62,640,641],{"class":291}," \u002F\u002F 不允许使用此方法请求资源\n",[62,643,645,648,650,653,655],{"class":64,"line":644},27,[62,646,647],{"class":207},"  NOT_ACCEPTABLE",[62,649,321],{"class":179},[62,651,652],{"class":89}," 406",[62,654,198],{"class":68},[62,656,657],{"class":291}," \u002F\u002F 无法使用请求的内容特性响应请求\n",[62,659,661,664,666,669,671],{"class":64,"line":660},28,[62,662,663],{"class":207},"  PROXY_AUTHENTICATION_REQUIRED",[62,665,321],{"class":179},[62,667,668],{"class":89}," 407",[62,670,198],{"class":68},[62,672,673],{"class":291}," \u002F\u002F 通过代理服务器访问资源需要进行代理认证\n",[62,675,677,680,682,685,687],{"class":64,"line":676},29,[62,678,679],{"class":207},"  REQUEST_TIMEOUT",[62,681,321],{"class":179},[62,683,684],{"class":89}," 408",[62,686,198],{"class":68},[62,688,689],{"class":291}," \u002F\u002F 请求超时\n",[62,691,693,696,698,701,703],{"class":64,"line":692},30,[62,694,695],{"class":207},"  CONFLICT",[62,697,321],{"class":179},[62,699,700],{"class":89}," 409",[62,702,198],{"class":68},[62,704,705],{"class":291}," \u002F\u002F 请求的资源存在冲突\n",[62,707,709],{"class":64,"line":708},31,[62,710,400],{"emptyLinePlaceholder":399},[62,712,714],{"class":64,"line":713},32,[62,715,716],{"class":291},"  \u002F\u002F 更多的4xx状态码，表示客户端错误\n",[62,718,720,723,725,728,730],{"class":64,"line":719},33,[62,721,722],{"class":207},"  GONE",[62,724,321],{"class":179},[62,726,727],{"class":89}," 410",[62,729,198],{"class":68},[62,731,732],{"class":291}," \u002F\u002F 之前可用的资源现已不可用，且将来也不会可用\n",[62,734,736,739,741,744,746],{"class":64,"line":735},34,[62,737,738],{"class":207},"  LENGTH_REQUIRED",[62,740,321],{"class":179},[62,742,743],{"class":89}," 411",[62,745,198],{"class":68},[62,747,748],{"class":291}," \u002F\u002F 服务器拒绝在没有定义Content-Length头的情况下接受请求\n",[62,750,752,755,757,760,762],{"class":64,"line":751},35,[62,753,754],{"class":207},"  PRECONDITION_FAILED",[62,756,321],{"class":179},[62,758,759],{"class":89}," 412",[62,761,198],{"class":68},[62,763,764],{"class":291}," \u002F\u002F 请求头中给出的条件不满足\n",[62,766,768,771,773,776,778],{"class":64,"line":767},36,[62,769,770],{"class":207},"  PAYLOAD_TOO_LARGE",[62,772,321],{"class":179},[62,774,775],{"class":89}," 413",[62,777,198],{"class":68},[62,779,780],{"class":291}," \u002F\u002F 请求的实体太大\n",[62,782,784,787,789,792,794],{"class":64,"line":783},37,[62,785,786],{"class":207},"  URI_TOO_LONG",[62,788,321],{"class":179},[62,790,791],{"class":89}," 414",[62,793,198],{"class":68},[62,795,796],{"class":291}," \u002F\u002F 请求的URI太长\n",[62,798,800,803,805,808,810],{"class":64,"line":799},38,[62,801,802],{"class":207},"  UNSUPPORTED_MEDIA_TYPE",[62,804,321],{"class":179},[62,806,807],{"class":89}," 415",[62,809,198],{"class":68},[62,811,812],{"class":291}," \u002F\u002F 请求的媒体类型不受支持\n",[62,814,816,819,821,824,826],{"class":64,"line":815},39,[62,817,818],{"class":207},"  RANGE_NOT_SATISFIABLE",[62,820,321],{"class":179},[62,822,823],{"class":89}," 416",[62,825,198],{"class":68},[62,827,828],{"class":291}," \u002F\u002F 请求的范围无效\n",[62,830,832,835,837,840,842],{"class":64,"line":831},40,[62,833,834],{"class":207},"  EXPECTATION_FAILED",[62,836,321],{"class":179},[62,838,839],{"class":89}," 417",[62,841,198],{"class":68},[62,843,844],{"class":291}," \u002F\u002F 服务器无法满足期望头字段的要求\n",[62,846,848],{"class":64,"line":847},41,[62,849,400],{"emptyLinePlaceholder":399},[62,851,853,856,858,861,863],{"class":64,"line":852},42,[62,854,855],{"class":207},"  UNPROCESSABLE_ENTITY",[62,857,321],{"class":179},[62,859,860],{"class":89}," 422",[62,862,198],{"class":68},[62,864,865],{"class":291}," \u002F\u002F 请求的实体不可处理但可能是有效的\n",[62,867,869,872,874,877,879],{"class":64,"line":868},43,[62,870,871],{"class":207},"  TOO_MANY_REQUESTS",[62,873,321],{"class":179},[62,875,876],{"class":89}," 429",[62,878,198],{"class":68},[62,880,881],{"class":291}," \u002F\u002F 发起的请求太多，太频繁\n",[62,883,885],{"class":64,"line":884},44,[62,886,400],{"emptyLinePlaceholder":399},[62,888,890],{"class":64,"line":889},45,[62,891,892],{"class":291},"  \u002F\u002F 5xx 状态码表示服务器错误\n",[62,894,896,899,901,903,905],{"class":64,"line":895},46,[62,897,898],{"class":207},"  INTERNAL_SERVER_ERROR",[62,900,321],{"class":179},[62,902,90],{"class":89},[62,904,198],{"class":68},[62,906,907],{"class":291}," \u002F\u002F 服务器发生内部错误\n",[62,909,911,914,916,919,921],{"class":64,"line":910},47,[62,912,913],{"class":207},"  NOT_IMPLEMENTED",[62,915,321],{"class":179},[62,917,918],{"class":89}," 501",[62,920,198],{"class":68},[62,922,923],{"class":291}," \u002F\u002F 服务器不支持请求的方法\n",[62,925,927,930,932,935,937],{"class":64,"line":926},48,[62,928,929],{"class":207},"  BAD_GATEWAY",[62,931,321],{"class":179},[62,933,934],{"class":89}," 502",[62,936,198],{"class":68},[62,938,939],{"class":291}," \u002F\u002F 服务器作为网关或代理，从上游服务器收到无效响应\n",[62,941,943,946,948,951,953],{"class":64,"line":942},49,[62,944,945],{"class":207},"  SERVICE_UNAVAILABLE",[62,947,321],{"class":179},[62,949,950],{"class":89}," 503",[62,952,198],{"class":68},[62,954,955],{"class":291}," \u002F\u002F 服务器目前无法使用（由于临时过载或维护）\n",[62,957,959,962,964,967,969],{"class":64,"line":958},50,[62,960,961],{"class":207},"  GATEWAY_TIMEOUT",[62,963,321],{"class":179},[62,965,966],{"class":89}," 504",[62,968,198],{"class":68},[62,970,971],{"class":291}," \u002F\u002F 服务器作为网关或代理，但是没有及时从上游服务器收到请求\n",[62,973,975,978,980,983,985],{"class":64,"line":974},51,[62,976,977],{"class":207},"  HTTP_VERSION_NOT_SUPPORTED",[62,979,321],{"class":179},[62,981,982],{"class":89}," 505",[62,984,198],{"class":68},[62,986,987],{"class":291}," \u002F\u002F 服务器不支持请求使用的HTTP版本\n",[62,989,991],{"class":64,"line":990},52,[62,992,400],{"emptyLinePlaceholder":399},[62,994,996],{"class":64,"line":995},53,[62,997,998],{"class":291},"  \u002F\u002F 表示未知的状态码\n",[62,1000,1002,1005,1007,1010],{"class":64,"line":1001},54,[62,1003,1004],{"class":207},"  UNKNOWN",[62,1006,321],{"class":179},[62,1008,1009],{"class":89}," 999",[62,1011,93],{"class":68},[62,1013,1015],{"class":64,"line":1014},55,[62,1016,122],{"class":68},[62,1018,1020],{"class":64,"line":1019},56,[62,1021,400],{"emptyLinePlaceholder":399},[62,1023,1025,1028,1031,1033,1036,1039,1041,1044,1046],{"class":64,"line":1024},57,[62,1026,1027],{"class":175},"import",[62,1029,1030],{"class":68}," {",[62,1032,183],{"class":156},[62,1034,1035],{"class":68}," }",[62,1037,1038],{"class":175}," from",[62,1040,109],{"class":108},[62,1042,1043],{"class":112},"@nestjs\u002Fcommon",[62,1045,83],{"class":108},[62,1047,214],{"class":68},[62,1049,1051,1053,1055,1057,1059,1061,1063,1066,1068],{"class":64,"line":1050},58,[62,1052,1027],{"class":175},[62,1054,1030],{"class":68},[62,1056,305],{"class":156},[62,1058,1035],{"class":68},[62,1060,1038],{"class":175},[62,1062,109],{"class":108},[62,1064,1065],{"class":112},"..\u002Fenum\u002Fhttp.enum",[62,1067,83],{"class":108},[62,1069,214],{"class":68},[62,1071,1073],{"class":64,"line":1072},59,[62,1074,400],{"emptyLinePlaceholder":399},[62,1076,1078,1080,1083,1086,1089,1091],{"class":64,"line":1077},60,[62,1079,297],{"class":175},[62,1081,1082],{"class":300}," class",[62,1084,1085],{"class":304}," ApiException",[62,1087,1088],{"class":300}," extends",[62,1090,183],{"class":304},[62,1092,308],{"class":68},[62,1094,1096,1099,1103,1105,1109],{"class":64,"line":1095},61,[62,1097,1098],{"class":300},"  private",[62,1100,1102],{"class":1101},"sucvu"," errCode",[62,1104,86],{"class":179},[62,1106,1108],{"class":1107},"sZMiF"," number",[62,1110,214],{"class":68},[62,1112,1114,1117,1119,1123,1125,1128,1131,1134,1137,1140,1142,1145,1148,1150,1152,1154,1156,1158,1160,1163,1165],{"class":64,"line":1113},62,[62,1115,1116],{"class":300},"  constructor",[62,1118,187],{"class":68},[62,1120,1122],{"class":1121},"s99_P","msg",[62,1124,86],{"class":179},[62,1126,1127],{"class":1107}," string",[62,1129,1130],{"class":179}," |",[62,1132,1133],{"class":304}," Record",[62,1135,1136],{"class":68},"\u003C",[62,1138,1139],{"class":1107},"string",[62,1141,198],{"class":68},[62,1143,1144],{"class":1107}," any",[62,1146,1147],{"class":68},">,",[62,1149,1102],{"class":1121},[62,1151,86],{"class":179},[62,1153,305],{"class":304},[62,1155,321],{"class":179},[62,1157,305],{"class":156},[62,1159,204],{"class":68},[62,1161,1162],{"class":207},"OK",[62,1164,211],{"class":68},[62,1166,308],{"class":68},[62,1168,1170,1173,1176,1179,1182],{"class":64,"line":1169},63,[62,1171,1172],{"class":175},"    switch",[62,1174,1175],{"class":186}," (",[62,1177,1178],{"class":156},"errCode",[62,1180,1181],{"class":186},") ",[62,1183,69],{"class":68},[62,1185,1187],{"class":64,"line":1186},64,[62,1188,1189],{"class":291},"      \u002F\u002F 没有权限访问\n",[62,1191,1193,1196,1198,1200,1203],{"class":64,"line":1192},65,[62,1194,1195],{"class":175},"      case",[62,1197,305],{"class":156},[62,1199,204],{"class":68},[62,1201,1202],{"class":207},"UNAUTHORIZED",[62,1204,1205],{"class":68},":\n",[62,1207,1209,1212,1214,1216,1218,1220,1222,1224,1226],{"class":64,"line":1208},66,[62,1210,1211],{"class":207},"        super",[62,1213,187],{"class":186},[62,1215,1122],{"class":156},[62,1217,198],{"class":68},[62,1219,305],{"class":156},[62,1221,204],{"class":68},[62,1223,1162],{"class":207},[62,1225,211],{"class":186},[62,1227,214],{"class":68},[62,1229,1231,1234,1236,1238,1240,1242,1244,1246],{"class":64,"line":1230},67,[62,1232,1233],{"class":75},"        this",[62,1235,204],{"class":68},[62,1237,1178],{"class":156},[62,1239,321],{"class":179},[62,1241,305],{"class":156},[62,1243,204],{"class":68},[62,1245,1202],{"class":207},[62,1247,214],{"class":68},[62,1249,1251,1254],{"class":64,"line":1250},68,[62,1252,1253],{"class":175},"        break",[62,1255,214],{"class":68},[62,1257,1259],{"class":64,"line":1258},69,[62,1260,1261],{"class":291},"      \u002F\u002F 登录失效\n",[62,1263,1265,1267,1269,1271,1273],{"class":64,"line":1264},70,[62,1266,1195],{"class":175},[62,1268,305],{"class":156},[62,1270,204],{"class":68},[62,1272,208],{"class":207},[62,1274,1205],{"class":68},[62,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294],{"class":64,"line":1277},71,[62,1279,1211],{"class":207},[62,1281,187],{"class":186},[62,1283,1122],{"class":156},[62,1285,198],{"class":68},[62,1287,305],{"class":156},[62,1289,204],{"class":68},[62,1291,1162],{"class":207},[62,1293,211],{"class":186},[62,1295,214],{"class":68},[62,1297,1299,1301,1303,1305,1307,1309,1311,1313],{"class":64,"line":1298},72,[62,1300,1233],{"class":75},[62,1302,204],{"class":68},[62,1304,1178],{"class":156},[62,1306,321],{"class":179},[62,1308,305],{"class":156},[62,1310,204],{"class":68},[62,1312,208],{"class":207},[62,1314,214],{"class":68},[62,1316,1318,1320],{"class":64,"line":1317},73,[62,1319,1253],{"class":175},[62,1321,214],{"class":68},[62,1323,1325],{"class":64,"line":1324},74,[62,1326,1327],{"class":291},"      \u002F\u002F 资源不存在， 验证码，接口地址，图片资源等等\n",[62,1329,1331,1333,1335,1337,1340],{"class":64,"line":1330},75,[62,1332,1195],{"class":175},[62,1334,305],{"class":156},[62,1336,204],{"class":68},[62,1338,1339],{"class":207},"NOT_FOUND",[62,1341,1205],{"class":68},[62,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361],{"class":64,"line":1344},76,[62,1346,1211],{"class":207},[62,1348,187],{"class":186},[62,1350,1122],{"class":156},[62,1352,198],{"class":68},[62,1354,305],{"class":156},[62,1356,204],{"class":68},[62,1358,1162],{"class":207},[62,1360,211],{"class":186},[62,1362,214],{"class":68},[62,1364,1366,1368,1370,1372,1374,1376,1378,1380],{"class":64,"line":1365},77,[62,1367,1233],{"class":75},[62,1369,204],{"class":68},[62,1371,1178],{"class":156},[62,1373,321],{"class":179},[62,1375,305],{"class":156},[62,1377,204],{"class":68},[62,1379,1339],{"class":207},[62,1381,214],{"class":68},[62,1383,1385,1387],{"class":64,"line":1384},78,[62,1386,1253],{"class":175},[62,1388,214],{"class":68},[62,1390,1392],{"class":64,"line":1391},79,[62,1393,1394],{"class":291},"      \u002F\u002F 其他归于服务器内部错误\n",[62,1396,1398,1401],{"class":64,"line":1397},80,[62,1399,1400],{"class":175},"      default",[62,1402,1205],{"class":68},[62,1404,1406,1408,1410,1412,1414,1416,1419,1421,1423,1425,1427],{"class":64,"line":1405},81,[62,1407,1211],{"class":207},[62,1409,187],{"class":186},[62,1411,1122],{"class":156},[62,1413,198],{"class":68},[62,1415,1102],{"class":156},[62,1417,1418],{"class":179}," ??",[62,1420,305],{"class":156},[62,1422,204],{"class":68},[62,1424,1162],{"class":207},[62,1426,211],{"class":186},[62,1428,214],{"class":68},[62,1430,1432,1434,1436,1438,1440,1442,1444,1447],{"class":64,"line":1431},82,[62,1433,1233],{"class":75},[62,1435,204],{"class":68},[62,1437,1178],{"class":156},[62,1439,321],{"class":179},[62,1441,305],{"class":156},[62,1443,204],{"class":68},[62,1445,1446],{"class":207},"INTERNAL_SERVER_ERROR",[62,1448,214],{"class":68},[62,1450,1452],{"class":64,"line":1451},83,[62,1453,1454],{"class":68},"    }\n",[62,1456,1458],{"class":64,"line":1457},84,[62,1459,1460],{"class":68},"  }\n",[62,1462,1464,1468,1471,1473,1475],{"class":64,"line":1463},85,[62,1465,1467],{"class":1466},"sVXei","  getErrCode",[62,1469,1470],{"class":68},"()",[62,1472,86],{"class":179},[62,1474,1108],{"class":1107},[62,1476,308],{"class":68},[62,1478,1480,1483,1486,1488,1490],{"class":64,"line":1479},86,[62,1481,1482],{"class":175},"    return",[62,1484,1485],{"class":75}," this",[62,1487,204],{"class":68},[62,1489,1178],{"class":156},[62,1491,214],{"class":68},[62,1493,1495],{"class":64,"line":1494},87,[62,1496,1460],{"class":68},[62,1498,1500],{"class":64,"line":1499},88,[62,1501,122],{"class":68},[124,1503,1504],{"id":1504},"异常过滤器",[26,1506,1507,1508],{},"具体操作可查看 ",[34,1509,1512],{"href":1510,"rel":1511},"https:\u002F\u002Fdocs.nestjs.com\u002Fexception-filters",[249],"官方 · Exception filters",[53,1514,1516],{"className":140,"code":1515,"language":142,"meta":9,"style":9},"import { ArgumentsHost, Catch, ExceptionFilter, HttpException, HttpStatus } from \"@nestjs\u002Fcommon\";\nimport { ApiException } from \"..\u002Fexception\u002Fapi.exception\";\nimport { HttpResult } from \"..\u002Fclass\u002Fresult.class\";\n\n@Catch()\nexport class AllExceptionFilter\u003CT> implements ExceptionFilter {\n  catch(exception: T, host: ArgumentsHost) {\n    const ctx = host.switchToHttp();\n    const response = ctx.getResponse();\n    const { status, result } = this.errorResult(exception);\n    response.header(\"Content-Type\", \"application\u002Fjson; charset=utf-8\");\n    response.status(status).json(result);\n  }\n\n  errorResult(exception: unknown) {\n    const status =\n      exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;\n\n    const code =\n      exception instanceof ApiException ? (exception as ApiException).getErrCode() : status;\n\n    let message: string;\n    if (exception instanceof HttpException) {\n      const response = exception.getResponse();\n      message = (response as any).message ?? response;\n    } else {\n      message = `${exception}`;\n    }\n\n    const getMsg = message;\n    \u002F\u002F 使用ValidationPipe可能会返回数组\n    if (Array.isArray(message)) {\n      message = getMsg[0];\n    } else {\n      message = getMsg;\n    }\n\n    return {\n      status: ![200, 500, 401].includes(status) ? 200 : status,\n      result: HttpResult.error(message, code),\n    };\n  }\n}\n",[59,1517,1518,1557,1578,1600,1604,1613,1637,1665,1686,1706,1739,1771,1798,1802,1806,1824,1833,1866,1870,1879,1913,1917,1931,1948,1967,1994,2004,2020,2024,2028,2041,2046,2069,2088,2096,2106,2110,2114,2120,2168,2194,2199,2203],{"__ignoreMap":9},[62,1519,1520,1522,1524,1527,1529,1532,1534,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555],{"class":64,"line":65},[62,1521,1027],{"class":175},[62,1523,1030],{"class":68},[62,1525,1526],{"class":156}," ArgumentsHost",[62,1528,198],{"class":68},[62,1530,1531],{"class":156}," Catch",[62,1533,198],{"class":68},[62,1535,1536],{"class":156}," ExceptionFilter",[62,1538,198],{"class":68},[62,1540,183],{"class":156},[62,1542,198],{"class":68},[62,1544,201],{"class":156},[62,1546,1035],{"class":68},[62,1548,1038],{"class":175},[62,1550,109],{"class":108},[62,1552,1043],{"class":112},[62,1554,83],{"class":108},[62,1556,214],{"class":68},[62,1558,1559,1561,1563,1565,1567,1569,1571,1574,1576],{"class":64,"line":72},[62,1560,1027],{"class":175},[62,1562,1030],{"class":68},[62,1564,1085],{"class":156},[62,1566,1035],{"class":68},[62,1568,1038],{"class":175},[62,1570,109],{"class":108},[62,1572,1573],{"class":112},"..\u002Fexception\u002Fapi.exception",[62,1575,83],{"class":108},[62,1577,214],{"class":68},[62,1579,1580,1582,1584,1587,1589,1591,1593,1596,1598],{"class":64,"line":96},[62,1581,1027],{"class":175},[62,1583,1030],{"class":68},[62,1585,1586],{"class":156}," HttpResult",[62,1588,1035],{"class":68},[62,1590,1038],{"class":175},[62,1592,109],{"class":108},[62,1594,1595],{"class":112},"..\u002Fclass\u002Fresult.class",[62,1597,83],{"class":108},[62,1599,214],{"class":68},[62,1601,1602],{"class":64,"line":119},[62,1603,400],{"emptyLinePlaceholder":399},[62,1605,1606,1608,1611],{"class":64,"line":332},[62,1607,149],{"class":68},[62,1609,1610],{"class":152},"Catch",[62,1612,157],{"class":156},[62,1614,1615,1617,1619,1622,1624,1627,1630,1633,1635],{"class":64,"line":348},[62,1616,297],{"class":175},[62,1618,1082],{"class":300},[62,1620,1621],{"class":304}," AllExceptionFilter",[62,1623,1136],{"class":68},[62,1625,1626],{"class":304},"T",[62,1628,1629],{"class":68},">",[62,1631,1632],{"class":300}," implements",[62,1634,1536],{"class":304},[62,1636,308],{"class":68},[62,1638,1639,1642,1644,1647,1649,1652,1654,1657,1659,1661,1663],{"class":64,"line":364},[62,1640,1641],{"class":1466},"  catch",[62,1643,187],{"class":68},[62,1645,1646],{"class":1121},"exception",[62,1648,86],{"class":179},[62,1650,1651],{"class":304}," T",[62,1653,198],{"class":68},[62,1655,1656],{"class":1121}," host",[62,1658,86],{"class":179},[62,1660,1526],{"class":304},[62,1662,211],{"class":68},[62,1664,308],{"class":68},[62,1666,1667,1670,1673,1675,1677,1679,1682,1684],{"class":64,"line":380},[62,1668,1669],{"class":300},"    const",[62,1671,1672],{"class":207}," ctx",[62,1674,321],{"class":179},[62,1676,1656],{"class":156},[62,1678,204],{"class":68},[62,1680,1681],{"class":152},"switchToHttp",[62,1683,1470],{"class":186},[62,1685,214],{"class":68},[62,1687,1688,1690,1693,1695,1697,1699,1702,1704],{"class":64,"line":396},[62,1689,1669],{"class":300},[62,1691,1692],{"class":207}," response",[62,1694,321],{"class":179},[62,1696,1672],{"class":156},[62,1698,204],{"class":68},[62,1700,1701],{"class":152},"getResponse",[62,1703,1470],{"class":186},[62,1705,214],{"class":68},[62,1707,1708,1710,1712,1715,1717,1720,1722,1724,1726,1728,1731,1733,1735,1737],{"class":64,"line":403},[62,1709,1669],{"class":300},[62,1711,1030],{"class":68},[62,1713,1714],{"class":207}," status",[62,1716,198],{"class":68},[62,1718,1719],{"class":207}," result",[62,1721,1035],{"class":68},[62,1723,321],{"class":179},[62,1725,1485],{"class":75},[62,1727,204],{"class":68},[62,1729,1730],{"class":152},"errorResult",[62,1732,187],{"class":186},[62,1734,1646],{"class":156},[62,1736,211],{"class":186},[62,1738,214],{"class":68},[62,1740,1741,1744,1746,1749,1751,1753,1756,1758,1760,1762,1765,1767,1769],{"class":64,"line":409},[62,1742,1743],{"class":156},"    response",[62,1745,204],{"class":68},[62,1747,1748],{"class":152},"header",[62,1750,187],{"class":186},[62,1752,83],{"class":108},[62,1754,1755],{"class":112},"Content-Type",[62,1757,83],{"class":108},[62,1759,198],{"class":68},[62,1761,109],{"class":108},[62,1763,1764],{"class":112},"application\u002Fjson; charset=utf-8",[62,1766,83],{"class":108},[62,1768,211],{"class":186},[62,1770,214],{"class":68},[62,1772,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1794,1796],{"class":64,"line":425},[62,1774,1743],{"class":156},[62,1776,204],{"class":68},[62,1778,243],{"class":152},[62,1780,187],{"class":186},[62,1782,243],{"class":156},[62,1784,211],{"class":186},[62,1786,204],{"class":68},[62,1788,57],{"class":152},[62,1790,187],{"class":186},[62,1792,1793],{"class":156},"result",[62,1795,211],{"class":186},[62,1797,214],{"class":68},[62,1799,1800],{"class":64,"line":441},[62,1801,1460],{"class":68},[62,1803,1804],{"class":64,"line":457},[62,1805,400],{"emptyLinePlaceholder":399},[62,1807,1808,1811,1813,1815,1817,1820,1822],{"class":64,"line":473},[62,1809,1810],{"class":1466},"  errorResult",[62,1812,187],{"class":68},[62,1814,1646],{"class":1121},[62,1816,86],{"class":179},[62,1818,1819],{"class":1107}," unknown",[62,1821,211],{"class":68},[62,1823,308],{"class":68},[62,1825,1826,1828,1830],{"class":64,"line":489},[62,1827,1669],{"class":300},[62,1829,1714],{"class":207},[62,1831,1832],{"class":179}," =\n",[62,1834,1835,1838,1841,1843,1846,1849,1851,1854,1856,1858,1860,1862,1864],{"class":64,"line":505},[62,1836,1837],{"class":156},"      exception",[62,1839,1840],{"class":179}," instanceof",[62,1842,183],{"class":304},[62,1844,1845],{"class":179}," ?",[62,1847,1848],{"class":156}," exception",[62,1850,204],{"class":68},[62,1852,1853],{"class":152},"getStatus",[62,1855,168],{"class":186},[62,1857,86],{"class":179},[62,1859,201],{"class":156},[62,1861,204],{"class":68},[62,1863,1446],{"class":207},[62,1865,214],{"class":68},[62,1867,1868],{"class":64,"line":521},[62,1869,400],{"emptyLinePlaceholder":399},[62,1871,1872,1874,1877],{"class":64,"line":537},[62,1873,1669],{"class":300},[62,1875,1876],{"class":207}," code",[62,1878,1832],{"class":179},[62,1880,1881,1883,1885,1887,1889,1891,1893,1896,1898,1900,1902,1905,1907,1909,1911],{"class":64,"line":542},[62,1882,1837],{"class":156},[62,1884,1840],{"class":179},[62,1886,1085],{"class":304},[62,1888,1845],{"class":179},[62,1890,1175],{"class":186},[62,1892,1646],{"class":156},[62,1894,1895],{"class":175}," as",[62,1897,1085],{"class":304},[62,1899,211],{"class":186},[62,1901,204],{"class":68},[62,1903,1904],{"class":152},"getErrCode",[62,1906,168],{"class":186},[62,1908,86],{"class":179},[62,1910,1714],{"class":156},[62,1912,214],{"class":68},[62,1914,1915],{"class":64,"line":548},[62,1916,400],{"emptyLinePlaceholder":399},[62,1918,1919,1922,1925,1927,1929],{"class":64,"line":564},[62,1920,1921],{"class":300},"    let",[62,1923,1924],{"class":156}," message",[62,1926,86],{"class":179},[62,1928,1127],{"class":1107},[62,1930,214],{"class":68},[62,1932,1933,1936,1938,1940,1942,1944,1946],{"class":64,"line":580},[62,1934,1935],{"class":175},"    if",[62,1937,1175],{"class":186},[62,1939,1646],{"class":156},[62,1941,1840],{"class":179},[62,1943,183],{"class":304},[62,1945,1181],{"class":186},[62,1947,69],{"class":68},[62,1949,1950,1953,1955,1957,1959,1961,1963,1965],{"class":64,"line":596},[62,1951,1952],{"class":300},"      const",[62,1954,1692],{"class":207},[62,1956,321],{"class":179},[62,1958,1848],{"class":156},[62,1960,204],{"class":68},[62,1962,1701],{"class":152},[62,1964,1470],{"class":186},[62,1966,214],{"class":68},[62,1968,1969,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992],{"class":64,"line":612},[62,1970,1971],{"class":156},"      message",[62,1973,321],{"class":179},[62,1975,1175],{"class":186},[62,1977,233],{"class":156},[62,1979,1895],{"class":175},[62,1981,1144],{"class":1107},[62,1983,211],{"class":186},[62,1985,204],{"class":68},[62,1987,101],{"class":156},[62,1989,1418],{"class":179},[62,1991,1692],{"class":156},[62,1993,214],{"class":68},[62,1995,1996,1999,2002],{"class":64,"line":628},[62,1997,1998],{"class":68},"    }",[62,2000,2001],{"class":175}," else",[62,2003,308],{"class":68},[62,2005,2006,2008,2010,2013,2015,2018],{"class":64,"line":644},[62,2007,1971],{"class":156},[62,2009,321],{"class":179},[62,2011,2012],{"class":108}," `${",[62,2014,1646],{"class":156},[62,2016,2017],{"class":108},"}`",[62,2019,214],{"class":68},[62,2021,2022],{"class":64,"line":660},[62,2023,1454],{"class":68},[62,2025,2026],{"class":64,"line":676},[62,2027,400],{"emptyLinePlaceholder":399},[62,2029,2030,2032,2035,2037,2039],{"class":64,"line":692},[62,2031,1669],{"class":300},[62,2033,2034],{"class":207}," getMsg",[62,2036,321],{"class":179},[62,2038,1924],{"class":156},[62,2040,214],{"class":68},[62,2042,2043],{"class":64,"line":708},[62,2044,2045],{"class":291},"    \u002F\u002F 使用ValidationPipe可能会返回数组\n",[62,2047,2048,2050,2052,2055,2057,2060,2062,2064,2067],{"class":64,"line":713},[62,2049,1935],{"class":175},[62,2051,1175],{"class":186},[62,2053,2054],{"class":156},"Array",[62,2056,204],{"class":68},[62,2058,2059],{"class":152},"isArray",[62,2061,187],{"class":186},[62,2063,101],{"class":156},[62,2065,2066],{"class":186},")) ",[62,2068,69],{"class":68},[62,2070,2071,2073,2075,2077,2080,2083,2086],{"class":64,"line":719},[62,2072,1971],{"class":156},[62,2074,321],{"class":179},[62,2076,2034],{"class":156},[62,2078,2079],{"class":186},"[",[62,2081,2082],{"class":89},"0",[62,2084,2085],{"class":186},"]",[62,2087,214],{"class":68},[62,2089,2090,2092,2094],{"class":64,"line":735},[62,2091,1998],{"class":68},[62,2093,2001],{"class":175},[62,2095,308],{"class":68},[62,2097,2098,2100,2102,2104],{"class":64,"line":751},[62,2099,1971],{"class":156},[62,2101,321],{"class":179},[62,2103,2034],{"class":156},[62,2105,214],{"class":68},[62,2107,2108],{"class":64,"line":767},[62,2109,1454],{"class":68},[62,2111,2112],{"class":64,"line":783},[62,2113,400],{"emptyLinePlaceholder":399},[62,2115,2116,2118],{"class":64,"line":799},[62,2117,1482],{"class":175},[62,2119,308],{"class":68},[62,2121,2122,2125,2127,2130,2132,2135,2137,2139,2141,2143,2145,2147,2150,2152,2154,2156,2159,2161,2164,2166],{"class":64,"line":815},[62,2123,2124],{"class":186},"      status",[62,2126,86],{"class":68},[62,2128,2129],{"class":179}," !",[62,2131,2079],{"class":186},[62,2133,2134],{"class":89},"200",[62,2136,198],{"class":68},[62,2138,90],{"class":89},[62,2140,198],{"class":68},[62,2142,572],{"class":89},[62,2144,2085],{"class":186},[62,2146,204],{"class":68},[62,2148,2149],{"class":152},"includes",[62,2151,187],{"class":186},[62,2153,243],{"class":156},[62,2155,1181],{"class":186},[62,2157,2158],{"class":179},"?",[62,2160,324],{"class":89},[62,2162,2163],{"class":179}," :",[62,2165,1714],{"class":156},[62,2167,93],{"class":68},[62,2169,2170,2173,2175,2177,2179,2182,2184,2186,2188,2190,2192],{"class":64,"line":831},[62,2171,2172],{"class":186},"      result",[62,2174,86],{"class":68},[62,2176,1586],{"class":156},[62,2178,204],{"class":68},[62,2180,2181],{"class":152},"error",[62,2183,187],{"class":186},[62,2185,101],{"class":156},[62,2187,198],{"class":68},[62,2189,1876],{"class":156},[62,2191,211],{"class":186},[62,2193,93],{"class":68},[62,2195,2196],{"class":64,"line":847},[62,2197,2198],{"class":68},"    };\n",[62,2200,2201],{"class":64,"line":852},[62,2202,1460],{"class":68},[62,2204,2205],{"class":64,"line":868},[62,2206,122],{"class":68},[53,2208,2210],{"className":140,"code":2209,"language":142,"meta":9,"style":9},"export class HttpResult {\n  readonly message: string;\n  readonly status: number;\n  readonly timestamp: string = new Date().toISOString();\n  readonly context: unknown;\n  constructor(context?: unknown, message: string = \"success\", status: number = 200) {\n    this.context = context;\n    this.message = message;\n    this.status = status;\n  }\n\n  static success(context: unknown, message = \"操作成功\") {\n    return new HttpResult(context, message, 200);\n  }\n\n  static error(message = \"操作失败\", status = 500) {\n    return new HttpResult(null, message, status);\n  }\n}\n",[59,2211,2212,2222,2235,2247,2276,2289,2336,2351,2365,2379,2383,2387,2420,2444,2448,2452,2484,2509,2513],{"__ignoreMap":9},[62,2213,2214,2216,2218,2220],{"class":64,"line":65},[62,2215,297],{"class":175},[62,2217,1082],{"class":300},[62,2219,1586],{"class":304},[62,2221,308],{"class":68},[62,2223,2224,2227,2229,2231,2233],{"class":64,"line":72},[62,2225,2226],{"class":300},"  readonly",[62,2228,1924],{"class":1101},[62,2230,86],{"class":179},[62,2232,1127],{"class":1107},[62,2234,214],{"class":68},[62,2236,2237,2239,2241,2243,2245],{"class":64,"line":96},[62,2238,2226],{"class":300},[62,2240,1714],{"class":1101},[62,2242,86],{"class":179},[62,2244,1108],{"class":1107},[62,2246,214],{"class":68},[62,2248,2249,2251,2254,2256,2258,2260,2262,2265,2267,2269,2272,2274],{"class":64,"line":119},[62,2250,2226],{"class":300},[62,2252,2253],{"class":1101}," timestamp",[62,2255,86],{"class":179},[62,2257,1127],{"class":1107},[62,2259,321],{"class":179},[62,2261,180],{"class":179},[62,2263,2264],{"class":1466}," Date",[62,2266,1470],{"class":156},[62,2268,204],{"class":68},[62,2270,2271],{"class":1466},"toISOString",[62,2273,1470],{"class":156},[62,2275,214],{"class":68},[62,2277,2278,2280,2283,2285,2287],{"class":64,"line":332},[62,2279,2226],{"class":300},[62,2281,2282],{"class":1101}," context",[62,2284,86],{"class":179},[62,2286,1819],{"class":1107},[62,2288,214],{"class":68},[62,2290,2291,2293,2295,2298,2301,2303,2305,2307,2309,2311,2313,2315,2318,2320,2322,2324,2326,2328,2330,2332,2334],{"class":64,"line":348},[62,2292,1116],{"class":300},[62,2294,187],{"class":68},[62,2296,2297],{"class":1121},"context",[62,2299,2300],{"class":179},"?:",[62,2302,1819],{"class":1107},[62,2304,198],{"class":68},[62,2306,1924],{"class":1121},[62,2308,86],{"class":179},[62,2310,1127],{"class":1107},[62,2312,321],{"class":179},[62,2314,109],{"class":108},[62,2316,2317],{"class":112},"success",[62,2319,83],{"class":108},[62,2321,198],{"class":68},[62,2323,1714],{"class":1121},[62,2325,86],{"class":179},[62,2327,1108],{"class":1107},[62,2329,321],{"class":179},[62,2331,324],{"class":89},[62,2333,211],{"class":68},[62,2335,308],{"class":68},[62,2337,2338,2341,2343,2345,2347,2349],{"class":64,"line":364},[62,2339,2340],{"class":75},"    this",[62,2342,204],{"class":68},[62,2344,2297],{"class":156},[62,2346,321],{"class":179},[62,2348,2282],{"class":156},[62,2350,214],{"class":68},[62,2352,2353,2355,2357,2359,2361,2363],{"class":64,"line":380},[62,2354,2340],{"class":75},[62,2356,204],{"class":68},[62,2358,101],{"class":156},[62,2360,321],{"class":179},[62,2362,1924],{"class":156},[62,2364,214],{"class":68},[62,2366,2367,2369,2371,2373,2375,2377],{"class":64,"line":396},[62,2368,2340],{"class":75},[62,2370,204],{"class":68},[62,2372,243],{"class":156},[62,2374,321],{"class":179},[62,2376,1714],{"class":156},[62,2378,214],{"class":68},[62,2380,2381],{"class":64,"line":403},[62,2382,1460],{"class":68},[62,2384,2385],{"class":64,"line":409},[62,2386,400],{"emptyLinePlaceholder":399},[62,2388,2389,2392,2395,2397,2399,2401,2403,2405,2407,2409,2411,2414,2416,2418],{"class":64,"line":425},[62,2390,2391],{"class":300},"  static",[62,2393,2394],{"class":1466}," success",[62,2396,187],{"class":68},[62,2398,2297],{"class":1121},[62,2400,86],{"class":179},[62,2402,1819],{"class":1107},[62,2404,198],{"class":68},[62,2406,1924],{"class":1121},[62,2408,321],{"class":179},[62,2410,109],{"class":108},[62,2412,2413],{"class":112},"操作成功",[62,2415,83],{"class":108},[62,2417,211],{"class":68},[62,2419,308],{"class":68},[62,2421,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442],{"class":64,"line":441},[62,2423,1482],{"class":175},[62,2425,180],{"class":179},[62,2427,1586],{"class":152},[62,2429,187],{"class":186},[62,2431,2297],{"class":156},[62,2433,198],{"class":68},[62,2435,1924],{"class":156},[62,2437,198],{"class":68},[62,2439,324],{"class":89},[62,2441,211],{"class":186},[62,2443,214],{"class":68},[62,2445,2446],{"class":64,"line":457},[62,2447,1460],{"class":68},[62,2449,2450],{"class":64,"line":473},[62,2451,400],{"emptyLinePlaceholder":399},[62,2453,2454,2456,2459,2461,2463,2465,2467,2470,2472,2474,2476,2478,2480,2482],{"class":64,"line":489},[62,2455,2391],{"class":300},[62,2457,2458],{"class":1466}," error",[62,2460,187],{"class":68},[62,2462,101],{"class":1121},[62,2464,321],{"class":179},[62,2466,109],{"class":108},[62,2468,2469],{"class":112},"操作失败",[62,2471,83],{"class":108},[62,2473,198],{"class":68},[62,2475,1714],{"class":1121},[62,2477,321],{"class":179},[62,2479,90],{"class":89},[62,2481,211],{"class":68},[62,2483,308],{"class":68},[62,2485,2486,2488,2490,2492,2494,2497,2499,2501,2503,2505,2507],{"class":64,"line":505},[62,2487,1482],{"class":175},[62,2489,180],{"class":179},[62,2491,1586],{"class":152},[62,2493,187],{"class":186},[62,2495,2496],{"class":75},"null",[62,2498,198],{"class":68},[62,2500,1924],{"class":156},[62,2502,198],{"class":68},[62,2504,1714],{"class":156},[62,2506,211],{"class":186},[62,2508,214],{"class":68},[62,2510,2511],{"class":64,"line":521},[62,2512,1460],{"class":68},[62,2514,2515],{"class":64,"line":537},[62,2516,122],{"class":68},[2518,2519,2520],"h3",{"id":2520},"使用",[26,2522,2523,2524,2527],{},"在",[59,2525,2526],{},"app.module.ts","中",[53,2529,2531],{"className":140,"code":2530,"language":142,"meta":9,"style":9},"@Module({\n  imports: [],\n  providers: [\n    {\n      provide: APP_FILTER,\n      useClass: AllExceptionFilter,\n    },\n  ]\n})\n",[59,2532,2533,2544,2556,2566,2571,2583,2594,2599,2604],{"__ignoreMap":9},[62,2534,2535,2537,2540,2542],{"class":64,"line":65},[62,2536,149],{"class":68},[62,2538,2539],{"class":152},"Module",[62,2541,187],{"class":156},[62,2543,69],{"class":68},[62,2545,2546,2549,2551,2554],{"class":64,"line":72},[62,2547,2548],{"class":186},"  imports",[62,2550,86],{"class":68},[62,2552,2553],{"class":156}," []",[62,2555,93],{"class":68},[62,2557,2558,2561,2563],{"class":64,"line":96},[62,2559,2560],{"class":186},"  providers",[62,2562,86],{"class":68},[62,2564,2565],{"class":156}," [\n",[62,2567,2568],{"class":64,"line":119},[62,2569,2570],{"class":68},"    {\n",[62,2572,2573,2576,2578,2581],{"class":64,"line":332},[62,2574,2575],{"class":186},"      provide",[62,2577,86],{"class":68},[62,2579,2580],{"class":207}," APP_FILTER",[62,2582,93],{"class":68},[62,2584,2585,2588,2590,2592],{"class":64,"line":348},[62,2586,2587],{"class":186},"      useClass",[62,2589,86],{"class":68},[62,2591,1621],{"class":156},[62,2593,93],{"class":68},[62,2595,2596],{"class":64,"line":364},[62,2597,2598],{"class":68},"    },\n",[62,2600,2601],{"class":64,"line":380},[62,2602,2603],{"class":156},"  ]\n",[62,2605,2606,2609],{"class":64,"line":396},[62,2607,2608],{"class":68},"}",[62,2610,2611],{"class":156},")\n",[124,2613,2614],{"id":2614},"参考文献",[2616,2617,2618,2631],"table",{},[2619,2620,2621],"thead",{},[2622,2623,2624,2628],"tr",{},[2625,2626,2627],"th",{},"资料",[2625,2629,2630],{},"说明",[2632,2633,2634,2646,2657],"tbody",{},[2622,2635,2636,2643],{},[2637,2638,2639],"td",{},[34,2640,2642],{"href":1510,"rel":2641},[249],"Exception filters",[2637,2644,2645],{},"官方",[2622,2647,2648,2655],{},[2637,2649,2650],{},[34,2651,2654],{"href":2652,"rel":2653},"https:\u002F\u002Fdocs.nestjs.com\u002Fexception-filters#built-in-http-exceptions",[249],"HTTP exceptions",[2637,2656,126],{},[2622,2658,2659,2665],{},[2637,2660,2661],{},[34,2662,2664],{"href":2663},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fnew\u002Ferror","new\u002Ferror",[2637,2666,2667],{},"主线教程",[2669,2670,2671],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--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 .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 .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 .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}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 .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 .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 .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}",{"title":9,"searchDepth":72,"depth":72,"links":2673},[2674,2675,2676,2679],{"id":126,"depth":72,"text":126},{"id":281,"depth":72,"text":281},{"id":1504,"depth":72,"text":1504,"children":2677},[2678],{"id":2520,"depth":96,"text":2520},{"id":2614,"depth":72,"text":2614},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FNestJS\u002Fbefore\u002Fexce","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FNestJS\u002Fbefore\u002Fexce.md","md",{"items":2685},[2686,2689,2692,2696,2699,2702],{"path":2687,"title":2688,"description":9,"category":10,"score":348},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fenv","环境加载",{"path":2690,"title":2691,"description":9,"category":10,"score":348},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdatabase","数据库的配置",{"path":2693,"title":2694,"description":2695,"category":10,"score":348},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Finfo","归档说明（before\u002F）","本目录（before\u002F）为早期 NestJS 实战笔记：以完整业务片段（守卫、拦截器、MongoDB、JWT 等）为主，写法与文件命名不统一。新项目请跟 new\u002F 主线，技术细节以 docs.nestjs.com 为准。",{"path":2697,"title":2698,"description":9,"category":10,"score":348},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fitc","统一响应格式拦截器",{"path":2700,"title":2701,"description":9,"category":10,"score":348},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fnext","路由守卫",{"path":2703,"title":2704,"description":9,"category":10,"score":348},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fdemo","入手Demo",{"series":2706,"title":2707,"items":2708,"index":96,"prev":2738,"next":2739},"booklet\u002Fend\u002Fnestjs\u002Fbefore","before",[2709,2711,2713,2715,2716,2718,2722,2724,2728,2732,2734],{"path":2690,"title":2691,"date":2710,"pinned":15},"2024-06-22",{"path":2703,"title":2704,"date":2712,"pinned":15},"2022-10-15",{"path":2687,"title":2688,"date":2714,"pinned":15},"2024-09-01",{"path":7,"title":8,"date":14,"pinned":15},{"path":2693,"title":2694,"date":2717,"pinned":15},"2023-08-31",{"path":2719,"title":2720,"date":2721,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Finjectable","操作日志拦截器","2020-02-20",{"path":2697,"title":2698,"date":2723,"pinned":15},"2023-08-17",{"path":2725,"title":2726,"date":2727,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fjwt","JWT 与 Passport 授权","2021-08-10",{"path":2729,"title":2730,"date":2731,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fmi","Nest 中间件","2022-06-21",{"path":2700,"title":2701,"date":2733,"pinned":15},"2022-12-01",{"path":2735,"title":2736,"date":2737,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnestjs\u002Fbefore\u002Fother","其他配置","2022-05-23",{"path":2687,"title":2688,"date":2714,"pinned":15},{"path":2693,"title":2694,"date":2717,"pinned":15}]