在nest.js中处理第三方依赖项

时间:2019-01-03 11:50:18

标签: typescript dependency-injection nestjs

如何在嵌套中处理第三方依赖项(即不以嵌套模块形式出现的依赖项)的最佳实践是什么?

例如,我通过在相应的文件中导入morgan来直接在自己的日志记录模块中使用

import { Injectable, MiddlewareFunction, NestMiddleware } from '@nestjs/common';
import * as morgan from 'morgan';

@Injectable()
export class NestLoggingMiddleware implements NestMiddleware {

    resolve(...args: any[]): MiddlewareFunction {
        /** use morgan here, e.g. wrap it in a custom middleware ... */
    }
}

现在,我知道Nest的体系结构受Angular的影响很大,我发现this article explaining how to deal with 3rd party dependencies in angular。同样的想法适用于巢吗?我应该为morgan创建自定义提供程序并将其注入吗?我是只注入morgan导入,还是已经配置好的morgan实例?

1 个答案:

答案 0 :(得分:0)

是的,将第三方依赖作为自定义提供程序注入是可行的方法。您可以使用异步工厂功能来注入设置配置所需的依赖项。这样,您将拥有一个已配置的实例。

这是我最近所做的一个例子:

import { Telegraf } from 'telegraf';

// ...

providers: [
  {
    provide: Telegraf,
    useFactory: async (configService: ConfigService) => {
      return new Telegraf(configService.telegramToken);
    },
    inject: [ConfigService],
  },
]

根据您的要求,为您的依赖项创建一个新模块以重新导出您的提供程序可能是有意义的。除了直接导出您的第3方实例外,您还可以创建一个封装依赖项的Facade服务。这样,在以后的某个时刻交换库变得更加容易。