NestJS中集成第三方库的自定义类全局可调用的正确实现方案
NestJS 集成 ccxt 全局服务实现方案
1. 安装依赖
首先安装所需的第三方包,已安装的依赖可跳过:
npm install ccxt @nestjs/schedule @nestjs/typeorm typeorm
2. 创建全局可注入的 CryptoManager 服务
NestJS 中默认所有带 @Injectable() 装饰器的服务都是单例模式,全应用共享同一个实例,刚好符合你全局调用的需求:
import { Injectable } from '@nestjs/common'; import { Cron } from '@nestjs/schedule'; import * as ccxt from 'ccxt'; import { InjectRepository } from '@nestjs/typeorm'; import { CryptoData } from './entities/crypto-data.entity'; // 替换为你自己的数据库实体 import { Repository } from 'typeorm'; @Injectable() export class CryptoManagerService { private exchange: ccxt.Exchange; constructor( @InjectRepository(CryptoData) private cryptoDataRepository: Repository<CryptoData>, ) { // 初始化你需要的交易所实例,示例为币安 this.exchange = new ccxt.binance({ enableRateLimit: true, }); } // 自定义调用ccxt的业务方法 async getTicker(symbol: string) { return await this.exchange.fetchTicker(symbol); } // 定时任务示例:每分钟拉取BTC价格存入数据库 @Cron('0 * * * * *') async saveBtcPriceTask() { const btcTicker = await this.getTicker('BTC/USDT'); const data = this.cryptoDataRepository.create({ symbol: 'BTC/USDT', price: btcTicker.last, timestamp: new Date(), }); await this.cryptoDataRepository.save(data); } // 其他自定义业务逻辑... }
3. 注册为全局模块
给服务所属的模块加上 @Global() 装饰器,导出服务后所有模块无需额外导入即可直接注入使用:
import { Global, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ScheduleModule } from '@nestjs/schedule'; import { CryptoManagerService } from './crypto-manager.service'; import { CryptoData } from './entities/crypto-data.entity'; @Global() // 标记为全局模块 @Module({ imports: [ ScheduleModule.forRoot(), // 定时任务模块全局仅需初始化一次 TypeOrmModule.forFeature([CryptoData]), // 注册数据库实体 ], providers: [CryptoManagerService], exports: [CryptoManagerService], // 导出服务供全应用使用 }) export class CryptoManagerModule {}
别忘了在根模块的 imports 数组中引入 CryptoManagerModule。
4. 其他组件调用示例
任意控制器、服务中都可以直接注入使用:
import { Controller, Get, Param } from '@nestjs/common'; import { CryptoManagerService } from './crypto-manager.service'; @Controller('crypto') export class CryptoController { // 直接注入即可,无需在当前模块导入CryptoManagerModule constructor(private readonly cryptoManager: CryptoManagerService) {} @Get('ticker/:symbol') getTicker(@Param('symbol') symbol: string) { return this.cryptoManager.getTicker(symbol); } }
注意事项
- 如果不需要使用定时任务,可以移除
@nestjs/schedule相关的依赖和代码即可 - 若需要对接多个交易所,可在
CryptoManagerService内新增多实例缓存逻辑,避免重复初始化交易所实例 - 服务默认是单例模式,全应用共享同一个实例,不会重复初始化ccxt连接
内容的提问来源于stack exchange,提问作者user16780074
相关产品推荐
相关产品推荐

