0

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

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

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

地址存储库.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];
  }
}

地址服务.ts

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

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

地址ServiceImpl.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,
      );
    }
  }
}

地址控制器.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());
  }
}

路线.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;

4

1 回答 1

0

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

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

...

// controller file

    @injectable()
    export class AddressController {
      constructor(@inject('AddressService') private addressService: IAddressService) {}
于 2021-12-16T16:57:24.790 回答