插座.IO在客户端没有接收到消息



我一直在尝试使用angular和nestjs使用本教程测试websocket。

这是我的Nestjs项目的网关。

import {
SubscribeMessage,
WebSocketGateway,
WebSocketServer,
WsResponse,
MessageBody
} from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway(3001)
export class EventsGateway {
@WebSocketServer()
server: Server;
@SubscribeMessage('message')
handleMessage(@MessageBody() data: any): WsResponse<string> {
return { event: 'response', data: data };
}
@SubscribeMessage('broadcast')
broadcast(@MessageBody() data: any): void {
this.server.emit('broadcast', 'response')
}
}

这个服务来自我的Angular项目。

import { Injectable } from '@angular/core';
import { io } from 'socket.io-client';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class WebsocketService {
private url = 'http://localhost:3001';
private socket;
connect() {
this.socket = io(this.url);
}
emit(emitName: string, data?) {
this.socket.emit(emitName, data);
}
on(onName: string) {
let observable = new Observable(observer => {
this.socket.on(onName, (data) => {
observer.next(data);
});
return () => { this.socket.disconnect(); };
});
return observable;
}
}

然而,结果不是我所期望的。客户端无法检索websocket数据。你可以在这里克隆我的仓库。

请帮忙!

我一直在搜索一段时间,现在在互联网上解决这个问题,但我找不到一个工作。可能是Nest bug,也可能是socket bug。输入或其他任何IO问题

所以,对于这个问题,我目前最好的方法是使用基本的express解决方案,完全忽略Nestjs方法。

首先卸载Nest的socket.io.

npm uninstall @nestjs/websockets @nestjs/platform-socket.io @types/socket.io

Second install express and socket.io

对于这个,我将使用已知的工作版本。

npm install --save express@4.17.1 socket.io@3.0.3

或者使用当前版本

npm install --save express socket.io

第三,我想保持Nestjs能够与websocket通信。因此,我将把套接字放在一个服务中。下面的代码将在ws目录下创建msg.service.ts文件。

nest g s /ws/msg

最后,我把websocket代码放在msg.service.ts文件中。

import { Injectable } from '@nestjs/common';
@Injectable()
export class MsgService {
private readonly PORT = '3030';
private readonly app;
private readonly http;
private readonly io;
private i: number = 0;
constructor() {
this.app = require('express')();
this.http = require('http').Server(this.app);
this.io = require('socket.io')(this.http, { cors: { origin: '*', } });
this.http.listen(this.PORT, () => {
console.log(`Socket.IO server running at http://localhost:${this.PORT}/`);
this.loop();
});
}
// Test broadcast every second.
loop() {
setTimeout(() => {
this.i++;
this.io.emit('broadcast', this.i);
console.log(this.i);
this.loop();
}, (1 * 1000));
};
}

。websocket将在Nestjs代码启动时运行。

我不知道这会导致什么样的性能问题,但我认为这是值得的,因为我们不会再为Nestjs未来版本的bug而烦恼。

相关内容

  • 没有找到相关文章

最新更新