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

Posted

技术标签:

【中文标题】在 nest.js 中处理第三方依赖项【英文标题】:Handling third party dependencies in nest.js 【发布时间】:2019-05-30 00:12:29 【问题描述】:

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

例如,我在自己的日志模块中直接使用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】:

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

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

import  Telegraf  from 'telegraf';

// ...

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

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

【讨论】:

以上是关于在 nest.js 中处理第三方依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Nest.js:如何覆盖导入模块中的提供程序?

Nest.js 无法解决对 TestingModule 的循环依赖

在 OSGi 包中添加第三方 Maven 依赖项的最佳方法

NestJS 错误:错误:Nest 无法解析 AuthService (?, JwtService) 的依赖项

在 Nest JS 中发出 http 请求时出现 httpService 未定义错误

为啥即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项?