首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用注射器将依赖注入控制器的错误

用注射器将依赖注入控制器的错误
EN

Stack Overflow用户
提问于 2021-08-04 16:38:29
回答 1查看 594关注 0票数 0

我用特快注射器和注射器进行依赖注射。

当我尝试使用控制器上的服务依赖项时,我会得到一个错误UnhandledPromiseRejectionWarning: TypeError:无法读取文件addressController.ts中未定义的的属性'addressService‘。

我已经搜索了几个视频和文章,但我找不到解决这些问题的方法。我会把我的代码留在下面

addressRepository.ts

代码语言:javascript
复制
import { AddressResponseDTO } from '../../dtos/response/address/addressResponseDTO';

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

addressRepositoryImpl.ts

代码语言:javascript
复制
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

代码语言:javascript
复制
import { AddressResponseDTO } from '../../dtos/response/address/addressResponseDTO';
import ResultResponseDTO from '../../dtos/response/resultResponseDTO';

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

addressServiceImpl.ts

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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;

EN

回答 1

Stack Overflow用户

发布于 2021-12-16 16:57:24

在IoC中将服务注册为'AddressServiceImpl‘,然后尝试将其调用为'AddressService’。

代码语言:javascript
复制
// service file
@injectable()
export default class AddressServiceImpl implements IAddressService {

..。

代码语言:javascript
复制
// controller file

    @injectable()
    export class AddressController {
      constructor(@inject('AddressService') private addressService: IAddressService) {}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68655036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档