如何在E2E测试中发送无引号的WebSocket初始化消息?
解决WebSocket发送无引号初始化消息的问题
方案1:调整RxJS发送逻辑,绕过自动序列化
RxJS的WebSocket客户端默认会对发送数据做JSON序列化,导致字符串被包裹引号。你可以通过发送Blob或直接使用原生WebSocket API结合RxJS,手动控制消息格式:
import { fromEvent } from 'rxjs'; import { map } from 'rxjs/operators'; // 直接创建原生WebSocket实例 const socket = new WebSocket('ws://你的后端地址'); // 监听连接打开事件,发送无引号的初始化消息 fromEvent(socket, 'open').subscribe(() => { socket.send('2probe'); }); // 监听后端返回消息 fromEvent(socket, 'message').pipe(map(event => event.data)).subscribe(data => { if (data === '3probe') { // 连接建立成功,继续发送后续消息 socket.send('5'); socket.send('3'); } });
也可以用RxJS的webSocket结合Blob发送:
import { webSocket } from 'rxjs/webSocket'; const socket$ = webSocket('ws://你的后端地址'); socket$.next(new Blob(['2probe'], { type: 'text/plain' }));
方案2:直接使用原生WebSocket API
如果不需要RxJS的响应式特性,原生API是最直接的解决方案,完全控制消息内容:
const socket = new WebSocket('ws://你的后端地址'); socket.onopen = () => { socket.send('2probe'); // 直接发送无引号字符串 }; socket.onmessage = (event) => { if (event.data === '3probe') { socket.send('5'); socket.send('3'); } };
方案3:配置nuxt-socket-io禁用自动序列化
如果要在测试中继续使用nuxt-socket-io,可在配置中关闭自动JSON序列化,让消息以原始字符串发送:
// nuxt.config.js 或测试环境配置文件 export default { io: { sockets: { default: { url: 'ws://你的后端地址', options: { parser: { encode: (data) => data, // 直接返回原始数据,不做序列化 decode: (data) => data } } } } } };
之后在测试中直接发送字符串即可:
this.$socket.send('2probe');
内容的提问来源于stack exchange,提问作者Serhii Iliushenko
相关产品推荐
相关产品推荐

