我是 NestJS 的新手,我没有找到任何明确的说明来完成我需要做的事情。
我想使用 NestJS 构建我的后端,我以前从未使用过它,但只听说过它的好东西。因此,我要构建的后端服务器将使用 npmjs 中名为 ccxt 的第 3 方模块。在普通的节点应用程序中,我只需创建一个随机类(例如 CryptoManager),导入 ccxt 模块并编写一些按设定时间间隔运行的函数或其他函数。然后我将创建一个控制器类来实例化该 CryptoManager 类的对象,然后我可以返回它的响应。
但是我应该如何使用 NestJS 来做到这一点呢?为了拥有一个正在运行其他嵌套控制器/服务等中可用的后台任务的自定义类,我必须做什么?
这个类只是应该执行第 3 方 (ccxt) 模块函数并将结果存储在数据库中。但我希望能够从 Nestjs 应用程序中的所有点(从所有模块)执行此类方法。
我希望我的问题很清楚,如果不清楚,请告诉我。
您将需要模块和提供程序的组合来以“嵌套方式”执行此操作,然后您可以在整个应用程序中使用依赖项注入。
一般来说,添加第三方库的方法如下:
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,
};
}
}
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 社区中广泛使用。