nestjs / nest

A progressive Node.js framework for building efficient, scalable, and enterprise-grade server-side applications with TypeScript/JavaScript 🚀
https://nestjs.com
MIT License
66.89k stars 7.56k forks source link

No way to use RPC client from service #63

Closed artaommahe closed 7 years ago

artaommahe commented 7 years ago
  1. RPC client cant be defined in service
  2. Controller (with defined RPC client) cannot be injected in service to call RCP actions via controller methods
  3. Controller cant be RPC client without defining @RequestMapping() on some method (try to remove method with @RequestMapping from controller and in controller constructor call this.client.send() after some timeout, this.client will be null)

Just got example from documentation (Client section) and tried all above. IMHO the most important is 2 issue cause it's useful to have controllers that works with all transport (http/ws/rpc) things and services for all other work. So service should be able to inject appropriate controller to call RPC client action or send smth away via websocket.

Update. Or maybe we can move RPC client/server to Gateway? They can be injected into anything and rpc has same interaction logic as websocket (ability to receive and send messages).

Yiin commented 7 years ago

Service that injects a controller sounds so wrong.

artaommahe commented 7 years ago

Service that injects a controller sounds so wrong

service that cant use rpc requests sound wrong too :) controllers are just transport handling buffer and inability to call rpc from main app part - services - looks strange. Also we have gateways that are same as controllers but for websocket and they can be injected to services :no_mouth:

kamilmysliwiec commented 7 years ago

Hi @artaommahe,

try to remove method with @RequestMapping from controller and in controller constructor call this.client.send() after some timeout, this.client will be null

It is quite interesting. Do you still have this issue after latest update? By the way, it should be possible to create @Client() in both controllers and components.

artaommahe commented 7 years ago

@kamilmysliwiec here it is https://github.com/artaommahe/nest-63

yarn
yarn run start

after 3 seconds

service client null
controller client null
artaommahe commented 7 years ago

@kamilmysliwiec i checked more - issue due to constructor() {} defined in both controller and service. So this will not work with explicitly defined constructor like so

  @Client({ transport: Transport.TCP, port: 65441 })
  private client: ClientProxy;

  constructor() {

    setTimeout(() => console.log('service client', this.client), 3000);
  }

In same repo remove service constructor, inject service into controller and call service method from controller and it works fine.

export class RpcClientController {

  constructor(private rpcClientService: RpcClientService) {

    setTimeout(() => console.log('controller client', this.rpcClientService.get()), 3000);
  }

Hope this will work with defined constructor in future.

kamilmysliwiec commented 7 years ago

Hi @artaommahe, Let's use OnModuleInit (https://docs.nestjs.com/lifecycle-events.html) lifecycle event instead of constructor.

artaommahe commented 7 years ago

@kamilmysliwiec but how can i inject smth in service if using constructor breaks RPC client creation?)

kamilmysliwiec commented 7 years ago

Since 3.0.0 constructor shouldn't break RPC client creation. You can inject dependencies through constructor, but interact with them after module init event.

artaommahe commented 7 years ago

@kamilmysliwiec moved console.log check to onModuleInit and it works, thx

lock[bot] commented 4 years ago

This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.