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



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

我想用NestJS构建我的后端,这是我以前从未使用过的,但只听说过的好东西。所以后端服务器,我要建立将使用第三方模块称为ccxt从npmjs。在一个正常的节点应用程序中,我只会创建一个随机类,例如CryptoManager,导入ccext模块并编写一些以设置间隔或其他方式运行的函数。然后我将创建一个控制器类,实例化该CryptoManager类的对象,并从那里我可以返回它的响应。

但是我应该如何用NestJS做到这一点?我要做什么,为了有一个自定义类,运行后台任务可用在其他巢控制器/服务等?

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

我希望我的问题是明确的,如果不是请让我知道。

你需要module和Providers的组合来"嵌套"地做到这一点,然后你就可以在整个应用中使用依赖注入。

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

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

Insidecrypto-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,
};
}
}

Insidecrypto-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();
}
}

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 {}

最后,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!';
}
}

这样做可以让您在测试时轻松模拟出kraken,允许您在forRoot中传递配置变量,以防您希望跨项目重用它,并且是在Nest社区中已经广泛存在的模式。

我已经为此目的创建了nestjs-ccxt一个NestJS CCXT模块包装器https://www.npmjs.com/package/nestjs-ccxt

首先导入CcxtModule作为任何其他模块

import { CcxtModule } from 'nestjs-ccxt';
@Module({
imports: [CcxtModule.forRoot({ ... })],
})
export class AppModule {}

下一个在你的服务注入CcxtService使用普通构造函数注入。

@Injectable()
export class ExchangeService {
constructor(private ccxtService: CcxtService) {}
async getBtcUsdtTicker() {
const client = await this.ccxtService.getClient('binance');
const ticker = await client.fetchTicker('BTC/USDT');
return ticker;
}
}

相关内容

最新更新