需求:用戶請求一個私有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)容。