javascript - 与 AppSync 的 Websocket 连接 : ErrorCode 400 'NoProtocolError'

标签 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);};
};

最佳答案

关于眼前的问题

该消息引用了 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”消息,并且可以继续握手(请参阅下一节)。

如何进行握手

See this document on AWS enter image description here

引用文献

关于javascript - 与 AppSync 的 Websocket 连接 : ErrorCode 400 'NoProtocolError' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74276986/

相关文章:

javascript - 如何将单个JSON文件加载到SproutCore模型中?

java - Java websockets 应该让线程保持忙碌吗?

websocket - 如何在 Julia 中编写 WebSocket 客户端?

amazon-dynamodb - AWS Amplify + Appsync - 是否可以使用@connection 转换来级联删除相关数据?

javascript - 从回调 javascript 函数返回变量

javascript - 在 javascript 中创建的文档元素的范围

javascript - 带有 Spring Boot 和 JavaScript 的 WebSocket

typescript - 如果我不使用放大,如何从 AppSync GraphQL 模式生成 Typescript 定义?

amazon-web-services - AWS AppSync DDoS 保护。有哪些选择?

javascript - 尝试编译时获取 `Error: [$parse:ueoe]`