如何使用 `ws` 库将此请求发送到 websockets

How to send this request to websockets using the `ws` library

我正在使用私有 API,尝试使用 ws 库通过 websockets 发送以下请求。我可以使用 Google Chrome 中的 Simple WebSocket Client extension 使此请求正常工作,但我使用 ws 尝试的所有操作均无效。 websockets 连接已建立。我知道这一点是因为我收到了一条通用心跳消息,并且我能够为其他目的获取事件。但是这篇简单的文章让我感到难过,主要是因为私有 API 的 websockets 使用文档很少,至少可以说,如果不是完全不存在的话。

要求:{"message":"ping"}

我的代码:

            const ws = new WebSocket(channelData.connectUri)
            ws.onerror = error => {
                console.log('Connection Error', error)
            }
            ws.onopen = () => {
                console.log("Connected")
                ws.emit("message", {"message":"ping"}) // this sends me my own message
                // it should send me this:
                // {"topicName": "channel.metadata", "eventBody": {"message": "pong"}}

                // ws.emit("message", "ping") // attempted this also, without success
            }
            ws.on("message", msg => console.log(msg))

我曾尝试使用 ws.send({"message":"ping"}),但出现此错误:

node:buffer:323
  throw new ERR_INVALID_ARG_TYPE(
  ^

TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Object
    at new NodeError (node:internal/errors:329:5)
    at Function.from (node:buffer:323:9)
    at toBuffer (/Users/user/Documents/GitHub/lib/node_modules/ws/lib/buffer-util.js:97:18)
    at Sender.send (/Users/user/Documents/GitHub/lib/node_modules/ws/lib/sender.js:261:17)
    at WebSocket.send (/Users/user/Documents/GitHub/lib/node_modules/ws/lib/websocket.js:361:18)
    at WebSocket.ws.onopen (/Users/user/Documents/GitHub/lib/server.js:55:20)
    at WebSocket.onOpen (/Users/user/Documents/GitHub/lib/node_modules/ws/lib/event-target.js:144:16)
    at WebSocket.emit (node:events:378:20)
    at WebSocket.setSocket (/Users/user/Documents/GitHub/lib/node_modules/ws/lib/websocket.js:177:10)
    at ClientRequest.<anonymous> (/Users/user/Documents/GitHub/lib/node_modules/ws/lib/websocket.js:671:15) {
  code: 'ERR_INVALID_ARG_TYPE'
}

这个ws.send("message", "ping")什么都不做。

您只能使用 WebSocket.prototype.send 发送 StringBuffer 数据。幸运的是,JSON.parse + JSON.stringify 快速弥合了结构化数据(ObjectArray 等)和 String.

之间的差距

尝试:

ws.send(JSON.stringify({"message":"ping"}));

接收端将得到 String,而不是 Object - 为了重新创建结构化数据,您可以执行:

let structuredData = JSON.parse(stringReceivedFromWebSocket);