NestJS異常捕獲

需求:用戶請求一個私有API獲取用戶配置信息,如果用戶沒有登錄,則會出現(xiàn)403錯誤,我們希望這時返回公共配置信息,而不是簡單返回403錯誤。

NestJS可以捕獲HttpException及其派生類型的異常,如果是其他類型的異常,則會直接返回

{
  "statusCode": 500,
  "message": "Internal server error"
}
異常觸發(fā)

要進行異常捕獲,就要在適當?shù)臅r候拋出異常,如

throw new HttpException('Forbidden', HttpStatus.FORBIDDEN);

HttpException有兩個參數(shù),第一個是response,它可以是一個對象或者字符串,第二個參數(shù)是響應碼

自定義響應體

默認響應體格式如下

{
  "statusCode": 403,
  "message": "Forbidden"
}

如果要改變響應體,則向HttpException的第一個參數(shù)傳遞一個對象,如

@Get()
async findAll() {
  throw new HttpException({
    status: HttpStatus.FORBIDDEN,
    error: 'This is a custom message',
  }, HttpStatus.FORBIDDEN);
}
自定義異常

大多數(shù)情況下,使用NestJS提供的異常類型即可,無需自行創(chuàng)建。自定義異常代碼如下

export class ForbiddenException extends HttpException {
  constructor() {
    super('Forbidden', HttpStatus.FORBIDDEN);
  }
}

上面的代碼會捕獲以下異常

@Get()
async findAll() {
  throw new ForbiddenException();
}
異常過濾器

異常過濾器擁有對異常層的完全控制權(quán),可以處理請求體和返回體

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    // 實例化Service,對數(shù)據(jù)庫進行訪問
    constructor(private settingsService: SettingsService) {}
    const ctx = host.switchToHttp()
    const response = ctx.getResponse<Response>()
    // const request = ctx.getRequest<Request>()
    // const status = exception.getStatus()
    const res = await this.settingsService.getUserSetting()
    response.json(res)

    // response
    // .status(status)
    // .json({
    //   statusCode: status,
    //   timestamp: new Date().toISOString(),
    //   path: request.url,
    // });
  }
}

status是狀態(tài)碼,response是返回對象,通過它可以控制返回的內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容