簡體   English   中英

使用 tsyringe 將依賴項注入控制器時出錯

[英]Error injecting dependency into controller with tsyringe

我正在使用 express 和 tsyringe 進行依賴注入。

當我嘗試在我的控制器上使用服務依賴項時,出現錯誤UnhandledPromiseRejectionWarning: TypeError: 無法讀取文件 addressController.ts中未定義的屬性“addressService”

我搜索了幾個視頻和文章,但找不到解決它們的方法。 我將在下面留下我的代碼

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]; } }

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

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

您將 IoC 中的服務注冊為“AddressServiceImpl”,然后嘗試將其調用為“AddressService”。

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

...

// controller file

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM