Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему @WebSocketServer() private server: Server является null?

Ginap12 Гуру (3627), закрыт 1 месяц назад
Почему @WebSocketServer() private server: Server является 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`;
}
}
Лучший ответ
frontDev Мастер (2034) 1 месяц назад
Декоратор @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.
Остальные ответы
Лайт Ягами Искусственный Интеллект (313319) 1 месяц назад
А где у тебя инициализация этого server?
Ginap12Гуру (3627) 1 месяц назад
всмысле?
ну вот main.ts и app.module.ts

Похожие вопросы