【问题标题】:Nestjs - Can't resolve dependencies of serviceNestjs - 无法解决服务的依赖关系
【发布时间】:2021-10-29 02:26:49
【问题描述】:

我不知道如何解决这个问题。我一直在尝试,但无法绕开它。

日志向我抛出这个 错误:Nest 无法解析 ERC20Service (?) 的依赖项。请确保索引 [0] 处的参数依赖在 ERC20Module 上下文中可用。

import { DynamicModule, Module, Provider } from '@nestjs/common';
import { ERC20Service } from './erc20.service';
const Web3 = require("web3");

export interface ERC20ModuleOptions {
  global?: boolean;
  abi: Object,
  wsEndpoint: string,
  httpEndpoint: string
}

export const WEB3_HTTP_TOKEN = 'WEB3_HTTP_TOKEN';
export const WEB3_WS_TOKEN = 'WEB3_WS_TOKEN'


export class ERC20Module {
  static forRoot(options: ERC20ModuleOptions): DynamicModule {
  
    const httpProvider: Provider = {
      provide: WEB3_HTTP_TOKEN,
      useValue:new Web3(new Web3.providers.HttpProvider(options.httpEndpoint))
    };
    const wsProvider: Provider = {
        provide: WEB3_WS_TOKEN,
        useValue:new Web3(new Web3.providers.WebsocketProvider(options.wsEndpoint))
      };

    return {
      module: ERC20Module,
      providers: [httpProvider, wsProvider, ERC20Service],
    
      exports: [ERC20Service],
      global: options.global,
    };
  }
}

import Web3 from "web3"
import { Inject, Injectable } from '@nestjs/common';
import { WEB3_HTTP_TOKEN, WEB3_WS_TOKEN } from './erc20.module';

@Injectable()
export class ERC20Service {
    constructor(@Inject(WEB3_HTTP_TOKEN) private http: Web3,@Inject(WEB3_WS_TOKEN) private ws: Web3) {
    
    }
}

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import { ERC20Module } from 'src/modules/erc20/erc20.module';
import { abi } from 'src/config/abi';

@Module({
  imports: [
    ConfigModule.forRoot(),
    ERC20Module.forRoot({
      global: true,
      httpEndpoint: `https://${process.env.CHAINSTACK_USER}:${process.env.CHAINSTACK_PASSWORD}@${process.env.CHAINSTACK_HTTP_ENDPOINT}`,
      wsEndpoint: `wss://${process.env.CHAINSTACK_USER}:${process.env.CHAINSTACK_PASSWORD}@${process.env.CHAINSTACK_WS_ENDPOINT}`,
      abi: abi,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

我一定是瞎了眼,因为据我所知,在注入、导出和导入方面,我所做的一切都是正确的。也许这里有人可以指导我解决这个问题。提前谢谢你

【问题讨论】:

  • 也尝试过,但结果完全相同

标签: node.js nestjs


【解决方案1】:

您的erc20.serviceerc20.module 文件相互导入,从而创建循环依赖关系。将常量移动到一个单独的文件中,你应该很高兴

// erc20.constants.ts
export const WEB3_HTTP_TOKEN = 'WEB3_HTTP_TOKEN';
export const WEB3_WS_TOKEN = 'WEB3_WS_TOKEN'
// erc20.module.ts
import { DynamicModule, Module, Provider } from '@nestjs/common';
import { WEB3_HTTP_TOKEN, WEB3_WS_TOKEN } from './erc20.constants';
import { ERC20Service } from './erc20.service';
const Web3 = require("web3");

export interface ERC20ModuleOptions {
  global?: boolean;
  abi: Object,
  wsEndpoint: string,
  httpEndpoint: string
}

export class ERC20Module {
  static forRoot(options: ERC20ModuleOptions): DynamicModule {
  
    const httpProvider: Provider = {
      provide: WEB3_HTTP_TOKEN,
      useValue:new Web3(new Web3.providers.HttpProvider(options.httpEndpoint))
    };
    const wsProvider: Provider = {
        provide: WEB3_WS_TOKEN,
        useValue:new Web3(new Web3.providers.WebsocketProvider(options.wsEndpoint))
      };

    return {
      module: ERC20Module,
      providers: [httpProvider, wsProvider, ERC20Service],
    
      exports: [ERC20Service],
      global: options.global,
    };
  }
}
// erc20.service.ts
import Web3 from "web3"
import { Inject, Injectable } from '@nestjs/common';
import { WEB3_HTTP_TOKEN, WEB3_WS_TOKEN } from './erc20.constants';

@Injectable()
export class ERC20Service {
    constructor(@Inject(WEB3_HTTP_TOKEN) private http: Web3,@Inject(WEB3_WS_TOKEN) private ws: Web3) {
    
    }
}

【讨论】:

  • 试过了,但仍然出现同样的错误。
  • 其实我的错,我仍然对服务类有错误的导入。你的回答成功了。谢谢楼主!
猜你喜欢
  • 2019-09-12
  • 2020-06-14
  • 2020-01-14
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 2019-12-19
相关资源
最近更新 更多