简体   繁体   中英

Dependecy Injection using Class into Express

I'm using Express into a TypeScript project and I have the following situation

This is my route file

...
import findAllUsersFactory from "src/factory/FindAllUsers";

routes.get("/users", findAllUsersFactory().handle);
...

This is the factory where I do a sequence of injections

const findAllUsersFactory = () => {
  const findAllUserRepository = new PrismaUsersRepository();
  const findAllUsersBusiness = new FindAllUsersBusiness(findAllUserRepository);
  const findAllUsersController = new FindAllUsersController(findAllUsersBusiness);

  return findAllUsersController;
};

This is my Controller

class FindAllUsersController {
  constructor(private findUserBusiness: FindAllUsersBusiness) { }
  async handle(request: Request, response: Response) {
    const allUsers = await this.findUserBusiness.execute();

    return response.status(200).send({ allUsers });
  }
}

And finally my Business

class FindAllUsersBusiness {
  constructor(private usersRepository: IUsersRepository) {}

  async execute() {
    return this.usersRepository.findAll();
  }
}

The problem is that I'm getting an error "Cannot read property 'execute' of undefined" because the findUserBusiness into handle function is undefined. And what I can't understand is that if I change my route to

routes.get("/users", (request, response) => {
  findAllUsersFactory().handle(request, response);
});

it works

I've tried to log the functions, but I can say why findUserBusiness is undefined since it came from the constructor, and since the handle functions came from an instance of FindAllUsersController it should have it "defined"

You need to make some adjustments in order to adapt your factory to the way router.get expects its parameters.

const findAllUsersFactory = (req, res) => {
  const findAllUserRepository = new PrismaUsersRepository();
  const findAllUsersBusiness = new FindAllUsersBusiness(findAllUserRepository);
  const findAllUsersController = new FindAllUsersController(findAllUsersBusiness);

  return findAllUsersController.handle(req, res)
};

Then in your router you need to do the following:

routes.get("/users", findAllUsersFactory);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM