Nest无法解析依赖项

问题描述 投票:0回答:1

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

运行npm start控制台说:

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

DescribeService

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个回答
0
投票

正如错误消息所示,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系统的更详细解释。

© www.soinside.com 2019 - 2024. All rights reserved.