【问题标题】:Nest can't resolve dependenciesNest 无法解决依赖关系
【发布时间】:2019-09-14 07:47:51
【问题描述】:

无法弄清楚我的代码有什么问题。查看错误描述的内容;我觉得没问题。

运行npm start 控制台说:

Nest 无法解析 DescribeService 的依赖关系 (UrlsAfipService,WsaaService,?)。请确保参数 at index [2] 在 ApiModule 上下文中可用。

描述服务

import { Injectable } from '@nestjs/common';
import { UrlsAfipService } from './urls-afip.service'
import { WsaaService } from './wsaa.service'
import * as soap from 'soap';

@Injectable()
export class DescribeService {

  constructor (
    private readonly urlsAfipService: UrlsAfipService,
    private readonly wsaaService: WsaaService,
    private clients: object
  ) {}

  private createClientForService(service: string): Promise<any> {
    return new Promise((resolve, reject) => {
      if (this.clients[service]) {
        resolve(this.clients[service])
      } else {
        soap.createClient(this.urlsAfipService.getService(service), (err, client) => {
          if (err && !client) {
            reject(err)
          } else {
            this.clients[service] = client;
            resolve(client);
          }
        })
      }
    })
  }

  describe(service) {
        this.wsaaService.generateToken(service).then((tokens) => {

            this.createClientForService(service).then((client) => {
                return client.describe()
            });

        }).catch((err) => {
            return err.message
        })
  }

}

ApiModule

import { Module } from '@nestjs/common';
import { ConfigModule } from '../config/config.module';
import { ApiController } from './api.controller';
import { UrlsAfipService } from './urls-afip.service'
import { WsaaService } from './wsaa.service'
import { DescribeService } from './describe.service';

@Module({
  controllers: [ApiController],
  providers: [UrlsAfipService, WsaaService, DescribeService],
  imports: [ConfigModule]
})

export class ApiModule {}

【问题讨论】:

    标签: javascript node.js typescript dependency-injection nestjs


    【解决方案1】:

    正如错误信息所说,您的DescribeService的构造函数的第三个参数无法解析,这是:

    private clients: object
    

    nestjs 中的服务(提供者)由启用依赖注入的应用程序上下文创建(实例化)。你可以只声明你需要一个服务而不考虑它的依赖关系。当然,这仅在所有依赖项都在应用程序上下文中时才有效。 object 显然不是提供者,因此无法注入。您没有指定 clients 是什么,但这是您声明它的方式:

    您可以在 ApiModules 提供程序中提供一组客户端:

    export const CLIENTS = 'clients';
    
    @Module({
      controllers: [ApiController],
      providers: [
        UrlsAfipService,
        WsaaService,
        DescribeService,
        { provide: CLIENTS, useValue: [clientA, clientB] }
      ],
      imports: [ConfigModule]
    })
    export class ApiModule {}
    

    然后您可以使用 @Inject 装饰器将数组注入您的服务中:

    export class DescribeService {
    
      constructor (
        private readonly urlsAfipService: UrlsAfipService,
        private readonly wsaaService: WsaaService,
        @Inject(CLIENTS) private clients: Client[],
      ) {}
    

    请查看answer,了解有关 Nest DI 系统的更详细说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2023-03-31
      • 1970-01-01
      • 2022-01-17
      • 2018-11-21
      • 2020-03-12
      • 2020-07-03
      • 2021-04-28
      相关资源
      最近更新 更多