Nestjs - 使用可用的第三方库的自定义类的正确方法是什么

use*_*074 1 node.js nestjs

我是 NestJS 的新手,我没有找到任何明确的说明来完成我需要做的事情。

我想使用 NestJS 构建我的后端,我以前从未使用过它,但只听说过它的好东西。因此,我要构建的后端服务器将使用 npmjs 中名为 ccxt 的第 3 方模块。在普通的节点应用程序中,我只需创建一个随机类(例如 CryptoManager),导入 ccxt 模块并编写一些按设定时间间隔运行的函数或其他函数。然后我将创建一个控制器类来实例化该 CryptoManager 类的对象,然后我可以返回它的响应。

但是我应该如何使用 NestJS 来做到这一点呢?为了拥有一个正在运行其他嵌套控制器/服务等中可用的后台任务的自定义类,我必须做什么?

这个类只是应该执行第 3 方 (ccxt) 模块函数并将结果存储在数据库中。但我希望能够从 Nestjs 应用程序中的所有点(从所有模块)执行此类方法。

我希望我的问题很清楚,如果不清楚,请告诉我。

HMi*_*adt 5

您将需要模块提供程序的组合来以“嵌套方式”执行此操作,然后您可以在整个应用程序中使用依赖项注入。

一般来说,添加第三方库的方法如下:

  1. 创建一个模块来包装您的库,例如“CryptoManagerModule”。
  2. 创建一个提供 CCXT 库的自定义提供程序,并将其添加到您的providers阵列中。
  3. 创建一个服务“CryptoManagerService”,并将 CCXT 注入构造函数中。
  4. 从模块中导出“CryptoManagerService”,以便您可以将其注入应用程序的其余部分。
  5. (可选)将您的模块标记为“全局”,这样您只需在 AppModule 中配置该模块一次即可使其可供所有其他模块使用。

里面crypto-manager.module.ts

import { DynamicModule, Module, Provider } from '@nestjs/common';
import { CryptoManagerService } from './crypto-manager.service';
import * as ccxt from 'ccxt';

// Add any config options you need, like API keys, etc
export interface CryptoManagerModuleOptions {
  global?: boolean;
}

export const KRAKEN_CLIENT_TOKEN = 'KRAKEN_CLIENT_TOKEN';

export class CryptoManagerModule {
  static forRoot(options: CryptoManagerModuleOptions): DynamicModule {
    // An example of injecting a single class of ccxt.  Note this is only available
    // within this module.
    const krakenProvider: Provider = {
      provide: KRAKEN_CLIENT_TOKEN,
      useValue: new ccxt.kraken(),
    };

    return {
      module: CryptoManagerModule,
      providers: [krakenProvider, CryptoManagerService],
      // Exports can be @Inject()'ed to other files, and if global
      // is set, then forRoot only needs to be called in the AppModule
      exports: [CryptoManagerService],
      global: options.global,
    };
  }
}

Run Code Online (Sandbox Code Playgroud)

里面crypto-manager.service.ts

import { Inject, Injectable } from '@nestjs/common';
import { KRAKEN_CLIENT_TOKEN } from './crypto-manager.module';
import { kraken } from 'ccxt';

@Injectable()
export class CryptoManagerService {
  constructor(@Inject(KRAKEN_CLIENT_TOKEN) private kraken: kraken) {}

  loadKrakenMarkets() {
    return this.kraken.loadMarkets();
  }
}
Run Code Online (Sandbox Code Playgroud)

里面app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CryptoManagerModule } from './crypto-manager/crypto-manager.module';

@Module({
  controllers: [AppController],
  providers: [AppService],
  // Make sure to call forRoot
  imports: [CryptoManagerModule.forRoot({ global: true })],
})
export class AppModule {}

Run Code Online (Sandbox Code Playgroud)

最后,它在app.service.ts. 我没有对此文件执行任何特殊操作,您只会看到记录到控制台的结果。

import { Inject, Injectable } from '@nestjs/common';
import { CryptoManagerService } from './crypto-manager/crypto-manager.service';

@Injectable()
export class AppService {
  constructor(private cryptoManagerService: CryptoManagerService) {}

  getHello(): string {
    this.cryptoManagerService.loadKrakenMarkets().then(console.log);
    return 'Hello World!';
  }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以kraken在测试时轻松进行模拟,并允许您在 forRoot 中传递配置变量,以防您想在项目之间重用它,并且这种模式已经在 Nest 社区中广泛使用。