用 Post 方法请求 posts 这个地址的时候,我们手工 throw 了一个异常, 客户端得到了一个响应,响应的数据说明了是哪里出了问题。
在 Nest 应用里,处理异常用的是 Exception Filter, 这里得到的这个异常的响应是应用里的一个全局 Exception Filter 处理的。
我们也可以创建自己的异常过滤器,去处理应用里面发生的异常情况。在终端,执行一下 nest generate,生成一个 filter,名字是 demo,放在 core/filters 下面。
nest generate filter demo core/filters
回到项目,打开创建的这个 Exception Filter。
异常过滤器是个类,这个类可以使用 @Catch 装饰器装饰, 类要实施 ExceptionFilter 接口, 所以需要在类里面添加一个 catch 方法。
这个方法有两个参数,一个是表示异常的 exception,还有一个是 host ,它是一个 ArgumentsHost。
这个 host 表示的其实就是应用的参数,如果这个过滤器用在 HTTP 应用的下面,ArgumentHost 里面会有 request 还有 response。如果是在 web sockets 应用里,它里面就包含 client 还有 data。
我们可以给 catch 提供一个参数, 就是它要处理的异常的名字, 比如 HttpException,这个类的 catch 方法,exception 会是一个 HttpException。
方法里面,添加一个 ctx, 用一下 host 上的 switchToHttp。
然后添加一个 response,表示响应,它的值用一下 ctx 上的 getResponse,得到响应对象。下面再添加一个 request, 用一下 ctx.getRequest,得到请求。
再添加一个 status 表示状态码,因为这个 exception 是 HttpException ,所以可以使用 getStatus 得到状态码。
下面用一下 response 上的 status,设置一下响应的状态,设置成 status, 接着再用 json,响应一个 json 格式的数据。
给它一个对象,可以添加一个 statusCode 属性,值是 status,再添加一个 path,值是 request 里的 url。