【问题标题】:Error injecting dependency into controller with tsyringe使用 tsyringe 将依赖项注入控制器时出错
【发布时间】:2021-12-17 00:57:24
【问题描述】:

我正在使用 express 和 tsyringe 进行依赖注入。

当我尝试在我的控制器上使用服务依赖项时,我收到一个错误 UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'addressService' of undefined in file addressController.ts

我搜索了多个视频和文章,但找不到解决方法。我将在下面留下我的代码

addressRepository.ts

import { AddressResponseDTO } from '../../dtos/response/address/addressResponseDTO';

export interface IAddressRepository {
  getAddresses(): Array<AddressResponseDTO>;
}

addressRepositoryImpl.ts

import { AddressResponseDTO } from '../../dtos/response/address/addressResponseDTO';
import { IAddressRepository } from '../declarations/addressRepository';

export default class AddressRepositoryImpl implements IAddressRepository {
  getAddresses(): Array<AddressResponseDTO> {
    const address1: AddressResponseDTO = {
      id: 'ADR123',
      postalCode: '17014273',
      address: 'Rua José Aiello',
      district: 'Centro',
      number: '347',
      city: 'Bauru',
      state: 'São Paulo',
      phoneNumber: '16997102842',
      clientName: 'João Mário Marcelo Campos',
    };

    const address2: AddressResponseDTO = {
      id: 'ADR456',
      postalCode: '07135290',
      address: 'Rua Mariano Moya Peramos',
      district: 'Jardim Adriana',
      number: '1103',
      city: 'Guarulhos',
      state: 'São Paulo',
      phoneNumber: '16997102842',
      clientName: 'João Mário Marcelo Campos',
    };

    return [address1, address2];
  }
}

addressService.ts

import { AddressResponseDTO } from '../../dtos/response/address/addressResponseDTO';
import ResultResponseDTO from '../../dtos/response/resultResponseDTO';

export interface IAddressService {
  getAddresses(): ResultResponseDTO<Array<AddressResponseDTO>>;
}

addressServiceImpl.ts

import { StatusCodes } from 'http-status-codes';
import { inject, injectable } from 'tsyringe';
import logger from '../../configurations/logger';
import { AddressResponseDTO } from '../../dtos/response/address/addressResponseDTO';
import ResultResponseDTO from '../../dtos/response/resultResponseDTO';
import { IAddressRepository } from '../../repositories/declarations/addressRepository';
import { IAddressService } from '../declarations/addressService';

@injectable()
export default class AddressServiceImpl implements IAddressService {
  private addressRepository: IAddressRepository;

  constructor(@inject('AddressRepository') addressRepository: IAddressRepository) {
    this.addressRepository = addressRepository;
  }

  getAddresses(): ResultResponseDTO<AddressResponseDTO[]> {
    try {
      logger.info('AddressService.getAddresses - start');

      const addresses = this.addressRepository.getAddresses();

      logger.info('AddressService.getAddresses - end');

      return ResultResponseDTO.ok(StatusCodes.OK, '', addresses);
    } catch (error) {
      logger.error(`AddressService.getAddresses - error - message ${error}`);
      return ResultResponseDTO.fail(
        StatusCodes.INTERNAL_SERVER_ERROR,
        'Error getting addresses',
        error,
      );
    }
  }
}

addressController.ts

行错误:const result = this.addressService.getAddresses();

import { Request, Response } from 'express';
import { inject, injectable } from 'tsyringe';
import { IAddressService } from '../services/declarations/addressService';

@injectable()
export class AddressController {
  constructor(@inject('AddressService') private addressService: IAddressService) {}

  public async getAddresses(request: Request, response: Response): Promise<Response> {
    const result = this.addressService.getAddresses();
    return response.status(result.httpStatus).json(result.getResponse());
  }
}

routes.ts

import { Router } from 'express';
import { container } from 'tsyringe';
import { AddressController } from './controllers/addressController';
import AddressRepositoryImpl from './repositories/implementations/addressRepositoryImpl';
import AddressServiceImpl from './services/implementations/addressServiceImpl';

const routes = Router();

container
  .register('AddressRepository', {
    useClass: AddressRepositoryImpl,
  })
  .resolve(AddressRepositoryImpl);

container
  .register('AddressService', {
    useClass: AddressServiceImpl,
  })
  .resolve(AddressServiceImpl);

const addressController = container.resolve(AddressController);

routes.get('/', (request, response) => {
  response.send('It works!');
});

// AddressController
routes.route('/v1/address').get(addressController.getAddresses);

export default routes;

【问题讨论】:

    标签: node.js express dependency-injection tsyringe


    【解决方案1】:

    您在 IoC 中将服务注册为“AddressServiceImpl”,然后尝试将其作为“AddressService”调用。

    // service file
    @injectable()
    export default class AddressServiceImpl implements IAddressService {
    

    ...

    // controller file
    
        @injectable()
        export class AddressController {
          constructor(@inject('AddressService') private addressService: IAddressService) {}
    

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2012-03-09
      • 2017-01-21
      • 2021-01-09
      • 2016-10-22
      • 2021-01-27
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多