【问题标题】:Nest.js cant resolve dependencies, can't find my mistakeNestjs 无法解析依赖,找不到我的错误
【发布时间】:2021-03-31 14:56:27
【问题描述】:

我正在做一个 Nest.js 程序,但我找不到我的依赖问题。我进行了很多搜索,并找到了很多有关此问题的答案,但我无法弄清楚为什么我的代码不起作用。所以我有一个产品模块,它有他的 DTO、实体、控制器、服务和模块,此外它还有一个服务接口。

产品控制器

import { Controller, Get } from '@nestjs/common';
import { ProductServiceInterface } from './interface/product.service.interface'

@Controller('products')
export class ProductController {
  constructor(private readonly productService: ProductServiceInterface) {}

  @Get()
  getHello(): string {
    return this.productService.test();
  }
}

产品服务接口

import { Injectable } from '@nestjs/common';
import {
  CreateProductInput,
  CreateProductOutput,
} from '../dto/create-product.dto';
import { FindProductOutput } from '../dto/find-product.dto';

export interface ProductServiceInterface {
  create(input: CreateProductInput): Promise<CreateProductOutput>;
  findProduct(productId: string): Promise<FindProductOutput>;
  test();
}

产品服务

import { Injectable } from '@nestjs/common';
import { ProductServiceInterface } from './interface/product.service.interface';
import {
  CreateProductInput,
  CreateProductOutput,
} from './dto/create-product.dto';
import { Product } from './entity/product.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { FindProductOutput } from './dto/find-product.dto';
//import WooCommerce from '../../config/woocomerce.config';

@Injectable()
export class ProductService implements ProductServiceInterface {
  constructor(
    @InjectRepository(Product)
    private productRepository: Repository<Product>,
  ) {}

  public async create(
    productDto: CreateProductInput,
  ): Promise<CreateProductOutput> {
    const product = new Product();
    product.name = productDto.name;
    product.price = productDto.price;
    product.imgUrl = productDto.imgUrl;

    const savedProduct = await this.productRepository.save(product);
    const productOutput = new CreateProductOutput();
    productOutput.id = savedProduct.id;
    return productOutput;
  }

  public async findProduct(idProduct: string): Promise<FindProductOutput> {
    const fetchedProduct = await this.productRepository.findOne(idProduct);
    const productOutput = new FindProductOutput();
    productOutput.id = fetchedProduct.id;
    productOutput.imgUrl = fetchedProduct.imgUrl;
    productOutput.name = fetchedProduct.name;
    productOutput.price = fetchedProduct.price;
    return productOutput;
  }

  public test() {
    return 'test'
    // WooCommerce.get('products', {
    //   pero_page: 20,
    // }).then((resp) => {
    //   return resp;
    // });
  }
}

产品模块

import { ProductController } from './product.controller';
import { ProductService } from './product.service';
import { Product } from './entity/product.entity';

import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';

@Module({
  imports: [TypeOrmModule.forFeature([Product])],
  controllers: [ProductController],
  providers: [ProductService],
})
export class ProductModule {}

AppModule

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import configuration from 'src/config/configuration';
import { TypeOrmModule } from '@nestjs/typeorm';
import { TypeOrmConfigService } from 'src/config/typeorm.config.service';
import { ProductModule } from './modules/product/product.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      load: [configuration],
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync({
      useClass: TypeOrmConfigService,
    }),
    ProductModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

我希望这段代码足以知道我的错误在哪里,我不喜欢让其他人为我解决这个问题,但我已经看了好几个小时的代码,不知道如何解决这个依赖问题。

【问题讨论】:

    标签: javascript node.js nestjs typeorm


    【解决方案1】:

    接口在运行时消失并变为{}Object。 Nest 使用参数类型元数据来确定应该注入的内容(通常通过ClassType.name)。你有两种选择来解决这个问题

    1. 使用抽象类而不是接口。这使得该类在运行时仍然可见,因此 ClassType.name 仍然有效。

    2. 使用@Inject('CustomToken') 来设置Nest 需要注入的元数据。然后,您需要确保使用类似的方式注册自定义提供程序

    {
      provide: 'CustomToken',
      useClass: ClassToBeUsed
    }
    

    这两种方法都可以解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2018-11-22
      • 2019-12-19
      • 2018-12-25
      相关资源
      最近更新 更多