我正在使用NestJs框架的lambda函数和@nestjs/mongoose
包作为数据库连接提供程序。我的问题是我想捕捉模块加载时发生的异常。
我尝试在main.ts
中使用Exception Filter作为全局过滤器,但它无法处理它们,因为NestJs首先加载模块,然后从main.ts
加载配置,所以这可能不是解决方案。
顺便说一下,当mongodb连接失败时,应用程序会使用内置的NestJs日志记录异常,但应用程序仍在运行,因此lambda函数超时结束,我得到的响应是(504)GATEWAY_TIMEOUT
状态。
数据库模块:
@Module({
imports: [
MongooseModule.forRootAsync({
imports: [MongoConfigModule],
useFactory: async (config: MongoConfigService) => ({
uri: config.URI,
// ... more config stuff here ...
}),
inject: [MongoConfigService],
}),
],
providers: [],
})
export class MongoDatabaseProviderModule {}
main.ts:
let server: Handler;
async function bootstrap(): Promise<Handler> {
const app = await NestFactory.create(ApiModule, { bufferLogs: true });
app.useLogger(app.get(Logger));
app.flushLogs();
const httpAdapter = app.get(HttpAdapterHost);
app.useGlobalFilters(
new AllExceptionsFilter(httpAdapter),
);
await app.init();
const appConfig: AppConfigService = app.get(AppConfigService);
app.setGlobalPrefix(appConfig.STAGE);
const expressApp = app.getHttpAdapter().getInstance();
return serverlessExpress({ app: expressApp });
}
export const handler: Handler = async (event: unknown, context: Context, callback: Callback) => {
server = server ?? (await bootstrap());
return server(event, context, callback);
};
例外过滤器:
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
constructor(private readonly httpAdapterHost: HttpAdapterHost) {}
catch(exception: unknown, 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,
timestamp: new Date().toISOString(),
path: httpAdapter.getRequestUrl(ctx.getRequest()),
};
httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus);
}
}
我所期望的是知道如何处理模块加载时的异常。以便在发生错误时给予快速响应。
1条答案
按热度按时间ni65a41a1#
在您的例子中,您可以使用try/catch块捕获在主.ts文件中的模块加载过程中发生的异常。下面是一个示例,说明如何修改bootstrap函数以捕获和处理异常:
通过将模块加载代码 Package 在try/catch块中,可以捕获在模块(包括数据库模块)初始化期间发生的任何异常。然后,您可以根据需要处理错误,例如记录错误或采取任何其他适当的操作。
请记住,如果在catch块中没有捕获并重新抛出异常,Lambda函数将继续执行,您仍然可能遇到超时问题。