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

DeX*_*eX3 6 dependency-injection typescript 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 ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我知道 nest 的架构深受 Angular 的影响,我发现这篇文章解释了如何处理 angular 中的 3rd 方依赖关系。同样的想法也适用于嵌套吗?我应该为它创建一个自定义提供程序morgan并注入它吗?我是只注入morgan导入还是已配置的morgan实例?

Kim*_*ern 6

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

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

import { Telegraf } from 'telegraf';

// ...

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

根据您的要求,为您的依赖项创建一个重新导出您的提供程序的新模块可能是有意义的。除了直接导出您的 3rd 方实例,您还可以创建封装依赖项的外观服务。这样,以后可以更轻松地交换库。