1

我在编写来自nestjs异常过滤器的自定义http响应时遇到问题
我正在使用nest fastify(不是express)
我正在创建捕获UserNotFoundException的自定义异常过滤器,如下所示:

@Catch(UserNotFoundException)
export class UserNotFoundExceptionFilter implements ExceptionFilter {
  catch(exception: UserNotFoundException, host: ArgumentsHost) {
    const errorResponse = new ErrorResponse<string[]>();
    const response = host.switchToHttp().getResponse();
    errorResponse.message = 'unauthorized exception'
    errorResponse.errors = [
      'invalid username or pass'
    ];
    response.status(401).json(errorResponse)

  }
}

我不断收到 response.status(...).json() 不是函数。

[Nest] 5400   - 05/17/2020, 00:27:26   [ExceptionsHandler] response.status(...).json is not a function +82263ms
TypeError: response.status(...).json is not a function

我知道我必须为某种类型的响应作者指定该响应的类型(例如:来自快递的响应)。

我尝试从 express 导入该 响应对象,并将响应变量的类型更新为 Response(express),如下所示:

import {Response} from 'express';
 const response = host.switchToHttp().getResponse<Response>();

一切顺利。

但我不想在我的应用程序中添加一些快速的东西,我只想使用nestjs fastify。你们知道任何可以从快递中替换此响应对象的类吗?或者,如果你有另一种更聪明的方法来解决这个问题,它也会有所帮助

谢谢大家

4

1 回答 1

3

如果您正在使用,则Fastify需要使用FastifyReply<ServerResponse>fromfastifyhttppackages 的类型。Fastify 本身没有json回复对象的方法,但它确实有一个.send()方法,JSON.stringify()如果给它一个对象,它就会变成一个对象。

如果您使用来自 的对象,可能会构建项目,但您可能会收到关于. 以下应该可以正常工作Responseexpressresponse.status().json is not a function

import { FastifyReply } from 'fastify';

@Catch(UserNotFoundException)
export class UserNotFoundExceptionFilter implements ExceptionFilter {
  catch(exception: UserNotFoundException, host: ArgumentsHost) {
    const errorResponse = new ErrorResponse<string[]>();
    const response = host.switchToHttp().getResponse<FastifyReply<ServerResponse>>();
    errorResponse.message = 'unauthorized exception'
    errorResponse.errors = [
      'invalid username or pass'
    ];
    response.status(401).send(errorResponse)

  }
}

总的来说,Nest 是 Express 和 Fastify 的包装器,大多数文档在讨论库特定选项(如请求和响应)时都与 Express 相关。当涉及到特定于库的方法时,你应该参考Fastify 的文档。

于 2020-05-16T20:14:18.637 回答