首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Nestjs -使用第三方库拥有自定义类的正确方法是什么?

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

Stack Overflow用户
提问于 2021-10-03 14:42:50
回答 2查看 3.2K关注 0票数 0

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

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

但是我该怎么用NestJS来做这个呢?要让一个自定义类运行其他嵌套控制器/服务中可用的后台任务,我必须做什么呢?

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

我希望我的问题是清楚的,如果没有,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-03 23:07:41

你需要模块提供者的结合才能做到这一点,然后你可以在整个应用程序中使用依赖注入。

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

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

内部crypto-manager.module.ts

代码语言:javascript
复制
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,
    };
  }
}

内部crypto-manager.service.ts

代码语言:javascript
复制
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

代码语言:javascript
复制
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中使用它的一个例子。我没有对这个文件做任何特别的事情,您将看到记录到控制台的结果。

代码语言:javascript
复制
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社区已经很普遍了。

票数 4
EN

Stack Overflow用户

发布于 2022-01-16 13:11:56

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

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

代码语言:javascript
复制
import { CcxtModule } from 'nestjs-ccxt';

@Module({
  imports: [CcxtModule.forRoot({ ... })],
})
export class AppModule {}

接下来,在您的服务中,使用普通构造函数注入注入CcxtService

代码语言:javascript
复制
@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;
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69425911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档