Экспресс утечка памяти Typescript - PullRequest
0 голосов
/ 22 сентября 2019

Я сталкиваюсь с утечкой памяти в моем проекте машинописи машинного перевода nodejs.У него мало API, которые выполняют простую операцию CRUD.Когда нагрузочный тест выполнялся в течение 1 часа в контейнере с 512 МБ ОЗУ, использование памяти продолжало увеличиваться, и система дважды перезагружалась.После проверки журналов GC стало ясно, что GC не высвобождает достаточно памяти, и большая ее часть сохраняется, что является случаем утечки памяти.* Link

@ Authorized()
@ JsonController('/test')
@ UseBefore(RequestHeaderValidation, RequestParamsValidation)
export class MyController {
    private logger = new Logger(__dirname);
    constructor(
        private myService: MyService,
    ) { }

    @ Get('/:testId')
    @ HttpCode(HTTP_STATUS.OK)
    public async getCustomerPreference(@Param('testId') testId: string, @Res() response: express.Response):
        Promise< string | void | express.Response> {
        try {
            await Joi.validate(testId, testSchema);
            const output = await this.myService.find(testId);
            if (!output) {
                this.logger.debug(`Invalid Output from DB: ${output}`);
                const result = await this.errorHandlingService.getErrors(errorMessages.NO_DATA_FOUND.code);
                return this.responseCreatorService.createErrorResponse(response, HTTP_STATUS.BAD_REQUEST, result, undefined);
            }
            return output;
        } catch (err) {
            this.logger.error('Error in get', err.isJoi ? err.details : err);
            const errorDetails = err.isJoi ? mapErrorObject(_.get(err, 'details[0]', {})) : { code: errorMessages.TECHNICAL_FAILURE.code };
            const error = await this.errorHandlingService.getErrors(errorDetails.code);
            return this.responseCreatorService.createErrorResponse(response, HTTP_STATUS.BAD_REQUEST, error, undefined);
        }
    }
}

myService.find имеет простой метод поиска typeorm.

RequestHeaderValidation и RequestParamsValidation - это два промежуточных ПО simlar, выполняющих некоторую проверку joi.

@ Middleware({ type: 'before' })
export class RequestHeaderValidation implements ExpressMiddlewareInterface {

    private log = new Logger(__dirname);

    constructor(
        private responseCreatorService: ResponseCreatorService
    ) { }

    public async use(req: express.Request, res: express.Response, next: express.NextFunction): Promise< any> {
        try {
            await Joi.validate(req.headers, requestHeaderSchema);
            next();
        } catch (err) {
            this.log.error('Error in header validation', err.isJoi ? err.details : err);
            const errorDetails = err.isJoi ? mapErrorObject(_.get(err, 'details[0]', {})) : { code: errorMessages.TECHNICAL_FAILURE.code };
            const error = formErrorRespObject(errorDetails.type, errorDetails.code, errorDetails.message);
            return this.responseCreatorService.createErrorResponse(res, HTTP_STATUS.BAD_REQUEST, error, undefined);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...