【问题标题】:Passing injected dependencies to external functions将注入的依赖项传递给外部函数
【发布时间】:2021-04-06 03:06:52
【问题描述】:

我有一个 NestJS 应用程序,其中我有一些关于使用 AWS S3 存储桶的逻辑。

我有一个模块,其中包含一个带有promiseWrapper 函数的服务,用于将回调转换为异步。

  private s3PromiseWrapper(action: string, params: S3ParamGetDTO): Promise<string> {
    console.log(params)
    return new Promise((resolve, reject) => {
      this.s3.getSignedUrl(
        action,
        {
          Bucket: params.bucketName,
          Key: params.key,
          Expires: params.expirationTimeSeconds,
        },
        (err: any, url: string) => {
          if (err) reject(err)
          resolve(url)
        }
      )
    })

没有另一个模块,需要使用相同的函数,所以不要重复我想创建一个全局函数作为util函数的代码,但这需要我将实例作为参数传递给函数.

  private s3PromiseWrapper(action: string, params: S3ParamGetDTO, s3Instance: S3): Promise<string> {
    console.log(params)
    return new Promise((resolve, reject) => {
      s3Instance.getSignedUrl(
        action,
        {
          Bucket: params.bucketName,
          Key: params.key,
          Expires: params.expirationTimeSeconds,
        },
        (err: any, url: string) => {
          if (err) reject(err)
          resolve(url)
        }
      )
    })

从依赖注入的角度来看,这是反模式吗?

【问题讨论】:

  • 为什么不直接使用S3.getSignedUrlPromise 方法呢?

标签: node.js amazon-s3 design-patterns dependency-injection nestjs


【解决方案1】:

您可以按以下方式创建 s3 包装器

 @Injectable({scope: transient})
    export class S3Service {

    private s3 = null //or just initiate the object;

    init() {
      this.s3 = new S3();
    }

    s3PromiseWrapper(action: string, params: S3ParamGetDTO): Promise<string> {
        console.log(params)
        return new Promise((resolve, reject) => {
          this.s3.getSignedUrl(
            action,
            {
              Bucket: params.bucketName,
              Key: params.key,
              Expires: params.expirationTimeSeconds,
            },
            (err: any, url: string) => {
              if (err) reject(err)
              resolve(url)
            }
          )
        })
    }

在任何其他服务中注入相同的服务

MYService() {
  constructor(
    private s3: S3Service
  ) {
    this.s3.init()
  }

  mymethod() {
    this.s3.s3PromiseWrapper()
  }
}

但是,请为其他需要的东西编写一个包装器。

javascript aws-sdk 已经提供了所有方法的承诺版本。 可以通过将.promise() 附加到方法来访问。

例如

this.s3.getSignedUrl(params).promise()

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多