Luc*_*cas 5 node.js typescript nestjs
我正在重构的 NestJS 应用程序上运行一些手动测试,并且刚刚从 Nest 的全局异常过滤器中发现了奇怪的行为。创建该项目的开发人员使用它作为异常过滤器:
import {
ExceptionFilter,
Catch,
ArgumentsHost,
HttpException,
HttpStatus,
} from '@nestjs/common';
import { HttpAdapterHost } from '@nestjs/core';
import { LoggerService } from '../../config/logger.service';
@Catch()
export class GlobalExceptionsFilter implements ExceptionFilter {
constructor(
private readonly httpAdapterHost: HttpAdapterHost,
private readonly logger: LoggerService,
) {}
catch(exception: Error, host: ArgumentsHost): void {
const { httpAdapter } = this.httpAdapterHost;
const ctx = host.switchToHttp();
const httpStatus =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
const responseBody = {
statusCode: httpStatus,
path: httpAdapter.getRequestUrl(ctx.getRequest()),
cause: `${exception.name}: ${exception.message}`,
timestamp: new Date().toISOString(),
};
this.logger.error(responseBody?.cause);
httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus);
}
}
Run Code Online (Sandbox Code Playgroud)
这与Nest 文档中的 catch-everything 过滤器示例几乎完全相同,因此它确实非常通用。
在这个项目的某个部分,有一个控制器,其内容如下:
@OnEvent(Events.POTATO_EVENT)
async potatoMethod(payload) {
return await this.service.potatoMethod(payload);
Run Code Online (Sandbox Code Playgroud)
目前,服务上没有有效负载验证potatoMethod,因此控制器使用来自另一个服务的有效负载EventEmitter2并将其转发到其服务,然后尝试通过调用 ORM 方法在数据库中获取记录。如果payload.potatoNumber发送正确,不会发生任何错误,但如果我payload.potatoNumber以未定义的方式发送,ORM 将抛出一个错误,该错误不会被该全局过滤器捕获。@OnEvent()如果我不使用 a 而@Get()直接在控制器上使用 a 将其转换为端点,则不会发生同样的事情。
目前,main看起来像这样:
(async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
})();
Run Code Online (Sandbox Code Playgroud)
我可能完全错了,但是只有当应用程序没有使用NestFactory.createMicroservice()它的main.ts文件时才会发生这种情况,对吧?如果是的话,微服务在 Nest 中到底是如何工作的?
| 归档时间: |
|
| 查看次数: |
625 次 |
| 最近记录: |