我是NestJS的新手,我没有找到任何明确的指示去做我需要做的事情。
我想用NestJS构建我的后端,我以前从未使用过,但只听说过一些好东西。因此,我将要构建的后端服务器将使用来自npmjs的一个名为ccxt的第三方模块。在一个普通的节点应用程序中,我只需创建一个随机类,例如CryptoManager,导入ccxt模块,并编写一些在设定时间间隔上运行的函数。然后,我将创建一个控制器类,它实例化CryptoManager类的一个对象,然后从那里返回它的响应。
但是我该怎么用NestJS来做这个呢?要让一个自定义类运行其他嵌套控制器/服务中可用的后台任务,我必须做什么呢?
这个类应该只执行第三方(ccxt)模块函数,并将结果存储在一个database.But中,我希望能够从nestjs应用程序的所有点(从所有模块)执行这个类方法。
我希望我的问题是清楚的,如果没有,请告诉我。
发布于 2021-10-03 23:07:41
你需要模块和提供者的结合才能做到这一点,然后你可以在整个应用程序中使用依赖注入。
一般来说,添加第三方库的方法如下:
providers数组中。内部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,
};
}
}内部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();
}
}内部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社区已经很普遍了。
发布于 2022-01-16 13:11:56
为此,我创建了一个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;
}
}https://stackoverflow.com/questions/69425911
复制相似问题