1

我正在尝试在 typescript 的一个小项目中使用 inversify 进行 DI 注入。我想创建一个日志中间件,用定制的 pino 记录器记录每个请求。我确实在创建应用程序时手动建立了依赖关系,但被 inversify 吸引并想尝试一下。

但我被卡住了,无法继续。这是我面临的错误。不确定是什么导致调用超出堆栈大小。请帮帮我

 public set app_port(app_port: number) {
                       ^
RangeError: Maximum call stack size exceeded

PinoLoggingService.ts

import * as pino from 'pino';
import * as os from 'os';
import * as momentTimeZone from 'moment-timezone';
import { DEFAULT_TIMEZONE, DEFAULT_TIME_FORMAT } from '../../shared/constants/app.constants';

import { AppConfigModel } from './../../shared/model/app.config.model';
import { isNullOrUndefined } from 'util';
import httpContext = require('express-http-context');
import { injectable, inject } from 'inversify';
import { TYPES } from '../../shared/constants/app.types';
import { AppConfigService } from '../../shared/service/app.config.service';

@injectable()
export class PinoLoggingService {

    private appConfig: AppConfigModel;
    constructor(@inject(TYPES.AppConfigService) private appConfigService: AppConfigService){
        this.appConfig = appConfigService.appConfigModel;
    }



    private getTimeStamp(){
        return momentTimeZone().tz(DEFAULT_TIMEZONE).format(DEFAULT_TIME_FORMAT);
    }


    public infoLogService (fileName): pino.Logger {
        return pino({
            level: 'info',
            name: this.appConfig.app_name,    

            messageKey: 'feedback-Logs',
            base: {pid: process.pid, hostname: os.hostname,
                timestamp: this.getTimeStamp(),
                appName: this.appConfig.app_name,
                fileName: fileName,
                request_id: isNullOrUndefined(httpContext.get('reqId')) ? 'Not an actual request ' : httpContext.get('reqId')
            },
            enabled: true,
            useLevelLabels: true,
        });
    }

}

我的 AppConfigService.ts - AppConfigModel 只是一个带有 getter 和 setter 的普通 ts。

@injectable()
export class AppConfigService implements IAppConfigService{

    private appModel: AppConfigModel;

    constructor() { 
        console.log('parg is:'+path.resolve(__dirname));

    }

    public get appConfigModel(): AppConfigModel {
        if(isNullOrUndefined(this.appModel)) {
            this.appModel = new AppConfigModel();
            this.appModel.app_port = isNullOrUndefined(process.env.PORT) ? DEFAULT_PORT : parseInt(process.env.PORT);
            this.appModel.app_lcp = process.env.LCP;
            this.appModel.app_name = process.env.APP_NAME;
            this.appModel.app_host = process.env.HOST;
            this.appModel.app_node_env = process.env.NODE_ENV;
            this.appModel.app_logging = JSON.parse (process.env.PINO_ENABLE_LOGGING);
            this.appModel.app_version = process.env.VERSION;
            this.appModel.app_context_path = process.env.CONTEXT_PATH;
        }
        return this.appModel;;
    }

}

这是我的 loggingMiddleware.ts

import * as express from 'express';
import { AppUtilService } from './../util/app.util.service';
import { file } from '@babel/types';
import { inject, injectable } from 'inversify';
import { TYPES } from '../constants/app.types';
import { PinoLoggingService } from '../../logging/service/logging.service';

interface ILoggingMiddleware {
    loggingMiddlewareMethod () : express.Router;
}

@injectable()
export class LoggingMiddleware implements ILoggingMiddleware {

    constructor(@inject(TYPES.AppUtilService) private utilService: AppUtilService,
                @inject(TYPES.PinoLoggingService) private pinoLoggingService: PinoLoggingService){

    }
    public loggingMiddlewareMethod() {
        const appRouter = express.Router();
        return appRouter.use((req:express.Request, res:express.Response, next) => {
        const fileName = this.utilService.getFileName(__filename);
        this.pinoLoggingService.infoLogService(fileName).info('req.url:', req.url);
        this.pinoLoggingService.infoLogService(fileName).info('req.headers:', req.headers);
        this.pinoLoggingService.infoLogService(fileName).info('req.body:', req.body);
        next();
    });
    }
}

这是我的请求跟踪中间件

const httpContext = require('express-http-context');
import * as express from 'express';
import { injectable } from 'inversify';

@injectable()
export class RequestTracerMiddleware {

    public requestTracer() {
        const app = express();
        app.use(httpContext.middleware);

    }
}

这是我的反转配置

import { Container } from "inversify";
import { TYPES } from "./module/shared/constants/app.types";
import { AppConfigService } from "./module/shared/service/app.config.service";
import { AppUtilService } from "./module/shared/util/app.util.service";
import { LoggingMiddleware } from "./module/shared/middlewares/logging.middleware";
import { CommonMiddleware } from "./module/shared/middlewares/common.middlewares";
import { RequestTracerMiddleware } from "./module/shared/middlewares/request.tracer.middleware";
import { PinoLoggingService } from "./module/logging/service/logging.service";

import { StudentController } from "./module/shared/test.controller";


const DIContainer = new Container({defaultScope: "Singleton"});

DIContainer.bind<AppConfigService>(TYPES.AppConfigService).to(AppConfigService);
DIContainer.bind<AppUtilService>(TYPES.AppUtilService).to(AppUtilService);
DIContainer.bind<LoggingMiddleware>(TYPES.LoggingMiddleware).to(LoggingMiddleware);
DIContainer.bind<CommonMiddleware>(TYPES.CommonMiddleware).to(CommonMiddleware);
DIContainer.bind<RequestTracerMiddleware>(TYPES.RequestTracerMiddleware).to(RequestTracerMiddleware);
DIContainer.bind<PinoLoggingService>(TYPES.PinoLoggingService).to(PinoLoggingService);
DIContainer.bind<StudentController>(TYPES.StudentController).to(StudentController);

export default DIContainer;

这是我的 server.ts

import 'reflect-metadata';
import * as DIContainer from './inversify.config';
import {InversifyExpressServer } from 'inversify-express-utils'
import { inject } from 'inversify';
import { TYPES } from './module/shared/constants/app.types';
import { CommonMiddleware } from './module/shared/middlewares/common.middlewares';
import { LoggingMiddleware } from './module/shared/middlewares/logging.middleware';
import { RequestTracerMiddleware } from './module/shared/middlewares/request.tracer.middleware';

const container = DIContainer.default;

let server = new InversifyExpressServer(container);

const commMiddleware = container.resolve(CommonMiddleware);
// const requestTracingMiddleware = container.resolve(RequestTracerMiddleware);
const loggingMiddleware = container.resolve(LoggingMiddleware);

server.setConfig(appRouter => {
    appRouter.use(commMiddleware.enableBodyParser());
    appRouter.use(loggingMiddleware.loggingMiddlewareMethod());

});

// set errorConfig if needed

const app = server.build();
app.listen(2000, () => {
    console.log('listening to port');
});

这是我设置的示例控制器。

import {controller, httpGet, httpPost, requestHeaders, requestParam, BaseHttpController, HttpResponseMessage, StringContent} from 'inversify-express-utils';

@controller("/IStudentController")
export class StudentController extends BaseHttpController {

    constructor( ) {
        super();
        console.log('value of stdservuce:');
    }

    @httpGet("/Iget")
    public getStudentDetails(@requestHeaders() reqHeaders: string[] ) {
        // sample returning json resuilt -  IHttpAcctionResults
        const val =  43;
        console.log('val from the servuc:', val);
        return this.json(val, 200);
    }
}
4

0 回答 0