Closed artaommahe closed 7 years ago
Service that injects a controller sounds so wrong.
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:
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.
@kamilmysliwiec here it is https://github.com/artaommahe/nest-63
yarn
yarn run start
after 3 seconds
service client null
controller client null
@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.
Hi @artaommahe,
Let's use OnModuleInit
(https://docs.nestjs.com/lifecycle-events.html) lifecycle event instead of constructor.
@kamilmysliwiec but how can i inject smth in service if using constructor breaks RPC client creation?)
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.
@kamilmysliwiec moved console.log
check to onModuleInit
and it works, thx
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.
@RequestMapping()
on some method (try to remove method with@RequestMapping
from controller and in controller constructor callthis.client.send()
after some timeout,this.client
will benull
)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).