我正在尝试与 appsync 建立直接的 Websocket 连接,但在连接后我不断收到 NoProtocolError
错误(
{"payload":{"errors":[{"message":"NoProtocolError","errorCode":400}]},"type":"connection_error"}'
)
这是我的代码
let ws = undefined;
const startWebsocket = () => {
const url = 'wss://XXXX.appsync-realtime-api.YYYY.amazonaws.com/graphql';
ws = new WebSocket(url);
// just log everything
ws.onopen = (e) => {console.log('Socket opened', e);};
ws.onmessage = (e) => {console.log('Msg received', e);};
ws.onclose = (e) => {console.log('Socket closed', e);};
ws.onerror = (e) => {console.log('Socket error', e);};
};
最佳答案
关于眼前的问题
该消息引用了 Websocket 构造函数的第二个参数:protocols
。 (MDN reference here)
您需要指定协议(protocol)(更精确的子协议(protocol)),如下所示:
ws = new WebSocket(url, ['graphql-ws']);
但是
请注意,您还缺少 header 信息、负载信息和整个握手过程。
仅更改添加协议(protocol)就会出现下一个错误:“ header ”和“有效负载”查询字符串参数均丢失
。
更多信息
Read more about how to build up a connection on aws.amazon.com .
打开带有 header 和负载的 websocket
const api_header = {
host: 'XXXX.appsync-api.YYYY.amazonaws.com',
'x-api-key': '<YOUR APPSYNC API KEY>',
};
// payload should be an empty JSON object
const payload = {};
const base64_api_header = btoa(JSON.stringify(api_header));
const base64_payload = btoa(JSON.stringify(payload));
const appsync_url = url + '?header=' + base64_api_header + '&payload=' + base64_payload;
ws = new WebSocket(appsync_url, ['graphql-ws']);
请注意,主机是appsync-api
,不是appsync-realtime-api
这样,您应该会看到一条“ka”消息,并且可以继续握手(请参阅下一节)。
如何进行握手
引用文献
关于javascript - 与 AppSync 的 Websocket 连接 : ErrorCode 400 'NoProtocolError' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74276986/