使用rxjs和angular6。我看到的答案中有95%仅使用旧版本的rxjs。
我要连接的服务器在连接启动期间需要有效的jwt令牌作为cookie。服务器响应101交换协议后,立即发出{ "status": "OK" }
。
握手的下一部分是让客户端(我正在写)发送{ "sessionId": "xxyyzz" }
。服务器用另一个{ "status": "OK" }
进行响应,然后开始发出事件。
或者至少应该如此?
我收到第一条{ "status": "OK" }
消息,发送sessionId和userId,第二条{ "status": "OK" }
通过。
我是rxjs和observables的新手,所以我想知道我的设置是否不正确。如果我发送ping命令,浏览器将显示正在发送的ping帧,但未响应(实现服务器端的工作-同事通过android等连接,就可以了)。
subject.next("ping")
甚至是正确的方法吗?我只是转圈而已,不胜感激。
subject: WebSocketSubject<any>;
connectAttempted: boolean;
connected: boolean;
connect(sessionId, userId) {
this.subject = webSocket({
url: `wss://remote.api.server/stream`
});
this.subject.subscribe(
(msg) => {
if(msg.status && msg.status == "OK" && !this.connectAttempted) {
this.subject.next(
{
sessionId: sessionId,
userId: userId,
eventClasses: []
}
);
this.connectAttempted = true;
} else if(msg.status && msg.status == "OK" && !this.connected) {
console.log("Handshake completed");
this.connected = true;
this.subject.next("ping");
} else if(msg.status && msg.status == "FAIL") {
this.connected = false;
console.log("FAIL! No longer connected");
} else {
console.log("Something other than status", JSON.stringify(msg))
}
},
(err) => {
console.log('error', err)
},
() => {
console.log('complete?')
this.connected = false;
this.connectAttempted = false;
}
);
}
答案 0 :(得分:0)
我对您的后端一无所知,但也许您应该对要发送的数据进行字符串化处理。通过订阅收到的所有内容都会自动解析。
this.subject.next(JSON.stringinfy(...));
请参阅此页面(“将消息推送到服务器”):https://rxjs-dev.firebaseapp.com/api/webSocket/webSocket