如何包含请求范围内的提供程序,该提供程序需要通过导入的模块插入请求

时间:2019-05-10 02:17:27

标签: nestjs

我们正在建立微服务的单一存储库,并希望有一些共享库可以导入到各种服务中。

现在,我正在尝试建立一个共享模块,该模块将具有需要访问请求的提供程序。这是一个示例:

import { Injectable, Scope, Inject } from '@nestjs/common'
import { REQUEST } from '@nestjs/core'
import { Request } from 'express'
import { APILogger } from '@freebird/logger'
import { APIGatewayProxyEvent, Context } from 'aws-lambda'

export interface IAPIGatewayRequest extends Request {
  apiGateway?: {
    event?: APIGatewayProxyEvent
    context?: Context
  }
}

@Injectable({ scope: Scope.REQUEST })
export class RequestLogger extends APILogger {
  constructor(@Inject(REQUEST) request: IAPIGatewayRequest) {
    if (!request.apiGateway || !request.apiGateway.event || !request.apiGateway.context) {
      throw new Error(
        'You are trying to use the API Gateway logger without having used the aws-serverless-express middleware',
      )
    }

    super(request.apiGateway.event, request.apiGateway.context)
  }
}

我一直试图像这样将其捆绑为模块:

import { Module } from '@nestjs/common'
import { RequestLogger } from './logger'

@Module({
  providers: [RequestLogger],
  exports: [RequestLogger],
})
export class LambdaModule {}

然后将其导入到主服务模块中,如下所示:

import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'
import { LambdaModule } from '@freebird/nest-lambda'

@Module({
  imports: [LambdaModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

但是,当我这样做时,我得到一个错误:

  

嵌套无法解析RequestLogger(?)的依赖项。请做出来   确保索引为[0]的参数在AppModule中可用   上下文。

但是,当我将RequestLogger提供程序插入服务模块,并像这样包含它时,我没有收到错误:

import { Module } from '@nestjs/common'
import { AppController } from './app.controller'
import { AppService } from './app.service'
import { RequestLogger } from './logger'

@Module({
  controllers: [AppController],
  providers: [AppService, RequestLogger],
})
export class AppModule {}

1 个答案:

答案 0 :(得分:0)

我发现了问题。就我而言,我的库包和服务包之间的要求略有不同。因此,不同版本的nest在起作用。这显然会引起冲突。