首页 > 解决方案 > 在 nest.js 中处理第三方依赖项

问题描述

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

例如,我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 的影响,我发现这篇文章解释了如何处理 angular 中的 3rd 方依赖项。同样的想法也适用于巢吗?我应该为它创建一个自定义提供程序morgan并注入它吗?我是只注入morgan导入,还是注入已经配置的morgan实例?

标签: typescriptdependency-injectionnestjs

解决方案


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

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

import { Telegraf } from 'telegraf';

// ...

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

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


推荐阅读