Декоратор @WebSocketServer() в вашем TestService имеет значение null, поскольку экземпляр сервера WebSocket должен быть объявлен в классе Gateway, а не в классе Service. Сервер WebSocket управляется Gateway, который обрабатывает соединения и события WebSocket. [1]
Вот как это исправить:
Переместите объявление сервера WebSocket в TestGateway:
@WebSocketGateway(3002, {
cors: {
origin: process.env.CLIENT_URL,
methods: ["GET", "POST"],
allowedHeaders: ["Content-Type"],
credentials: true,
},
namespace: '/'
})
export class TestGateway {
@WebSocketServer()
private server: Server;
constructor(private readonly testService: TestService) {}
// ... остальная часть кода шлюза
}
Если вам необходимо отправлять события из сервиса, передайте экземпляр сервера в метод сервиса:
@Injectable()
export class TestService {
findAll(server: Server) {
return server.emit('findAllTest', { body: 'hello' });
}
// ... остальная часть кода сервиса
}
Обновите метод шлюза для передачи сервера:
@WebSocketGateway(3002, {
// ... конфигурация шлюза
})
export class TestGateway {
@WebSocketServer()
private server: Server;
constructor(private readonly testService: TestService) {}
@SubscribeMessage('findAllTest')
findAll() {
return this.testService.findAll(this.server);
}
// ... остальные методы шлюза
}
Декоратор @WebSocketServer() работает только в классах, декорированных @WebSocketGateway(), поэтому в вашем классе службы он был равен null.
import { Module } from '@nestjs/common';
import { TestService } from './test.service';
import { TestGateway } from './test.gateway';
@Module({
providers: [TestGateway, TestService],
})
export class TestModule {}
import { WebSocketGateway, SubscribeMessage, MessageBody } from '@nestjs/websockets';
import { TestService } from './test.service';
import { CreateTestDto } from './dto/create-test.dto';
import { UpdateTestDto } from './dto/update-test.dto';
@WebSocketGateway(3002, {
cors: {
origin: process.env.CLIENT_URL,
methods: ["GET", "POST"],
allowedHeaders: ["Content-Type"],
credentials: true,
},
namespace: '/'
})export class TestGateway {
constructor(private readonly testService: TestService) {}
@SubscribeMessage('createTest')
create(@MessageBody() createTestDto: CreateTestDto) {
return this.testService.create(createTestDto);
}
@SubscribeMessage('findAllTest')
findAll() {
return this.testService.findAll();
}
@SubscribeMessage('findOneTest')
findOne(@MessageBody() id: number) {
return this.testService.findOne(id);
}
@SubscribeMessage('updateTest')
update(@MessageBody() updateTestDto: UpdateTestDto) {
return this.testService.update( updateTestDto.id , updateTestDto);
}
@SubscribeMessage('removeTest')
remove(@MessageBody() id: number) {
return this.testService.remove(id);
}
}
import { Injectable } from '@nestjs/common';
import { CreateTestDto } from './dto/create-test.dto';
import { UpdateTestDto } from './dto/update-test.dto';
import { WebSocketServer } from '@nestjs/websockets';
import { Server } from ' socket.io ';
@Injectable()
export class TestService {
@WebSocketServer()
private server: Server;
create(createTestDto: CreateTestDto) {
return 'This action adds a new test';
}
findAll() {
return this.server.emit('findAllTest', { body: 'hello' });
}
findOne(id: number) {
return `This action returns a #${id} test`;
}
update(id: number, updateTestDto: UpdateTestDto) {
return `This action updates a #${id} test`;
}
remove(id: number) {
return `This action removes a #${id} test`;
}
}