The*_*ser 2 javascript websocket aws-appsync
我正在尝试与 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);};
};
Run Code Online (Sandbox Code Playgroud)
该消息引用了 Websocket 构造函数的第二个参数:protocols。(MDN参考这里)
您需要指定协议(更精确的子协议),如下所示:
ws = new WebSocket(url, ['graphql-ws']);
Run Code Online (Sandbox Code Playgroud)
请注意,您还缺少标头信息、有效负载信息和整个握手过程。
只有更改添加协议才会出现下一个错误:Both, the "header", and the "payload" query string parameters are missing。
阅读有关如何在 aws.amazon.com 上建立连接的更多信息。
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']);
Run Code Online (Sandbox Code Playgroud)
请注意,主机是appsync-api而不是 appsync-realtime-api
这样,您应该会看到一条“ka”消息,并且可以继续握手(请参阅下一节)。
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |