mongoose 如何用NestJs处理lambda函数中的数据库连接异常?

6tr1vspr  于 2023-05-29  发布在  Go
关注(0)|答案(1)|浏览(95)

我正在使用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);
    }
}

我所期望的是知道如何处理模块加载时的异常。以便在发生错误时给予快速响应。

ni65a41a

ni65a41a1#

在您的例子中,您可以使用try/catch块捕获在主.ts文件中的模块加载过程中发生的异常。下面是一个示例,说明如何修改bootstrap函数以捕获和处理异常:

async function bootstrap(): Promise<Handler> {
  try {
    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 });
  } catch (error) {
    // Handle the error here
    console.error('Error during module loading:', error);
    throw error; // Rethrow the error to propagate it further if necessary
  }
}

通过将模块加载代码 Package 在try/catch块中,可以捕获在模块(包括数据库模块)初始化期间发生的任何异常。然后,您可以根据需要处理错误,例如记录错误或采取任何其他适当的操作。
请记住,如果在catch块中没有捕获并重新抛出异常,Lambda函数将继续执行,您仍然可能遇到超时问题。

相关问题