当我对一条消息执行socket.send()时,我收到以下错误:Received message: {"type":"error","id":15,"payload":{"name":"TypeError","message":"iterator.next is not a function"}}

不确定显示此问题的原因以及如何修复它.此代码有错误:

socket.send(JSON.stringify(message))

以下是完整的代码:

export default function () {
  const url =
    "wss://test.com/graphql";
  const query = `test ($scope: String = "DEFAULT", $test: Boolean = false) {
    update(scope: $scope: $test) {
      id
      status
        __typename
      }
      __typename
    }
  }
  `;
  const variables = {
    scope: "DEFAULT",
    topic: [
      "football.*.6ec99981-9ffe-4722",
    ],
  };
  const params = {
    headers: {
      Authorization:
        "testauth"
      "Sec-WebSocket-Protocol": "graphql-ws",
      Pragma: "no-cache",
    },
  };

  const message = {
    id: 15,
    payload: { query, variables },
  };

  const response = ws.connect(url, params, function (socket) {
    socket.on("open", function open() {
      console.log("WebSocket connection established.");

      // Send the GraphQL message
      socket.send(JSON.stringify(message));
    });

推荐答案

您遇到的错误"Iterator.Next不是一个函数"表明可能是WebSocket连接或消息格式有问题.此错误通常与使用不正确的协议或服务器响应问题有关.

以下是对问题进行故障排除和解决的一些建议:

判断WebSocket协议: 确保WebSocket服务器使用正确的协议.在您的代码中,您已经设置了"SEC-WebSocket-Protocol":"GraphQL-ws"头.验证服务器是否支持并期望使用"GraphQL-ws"协议.如果服务器需要不同的协议,请相应地调整报头.

正确的类型: 您的GraphQL查询中似乎有一个拼写错误.将TEST($SCOPE:STRING="DEFAULT",$TEST:BOOLEAN=FALSE)替换为TEST($SCOPE:STRING="DEFAULT",$TEST:Boolean=FALSE).

处理套接字错误: 为"error"事件添加一个事件侦听器,以捕获WebSocket连接期间可能发生的任何错误:

socket.on("error", function (error) {
  console.error("WebSocket error:", error);
});

这将帮助您捕获在WebSocket连接期间可能发生的任何错误.

判断服务器日志(log): 判断来自WebSocket服务器的日志(log)或错误消息.服务器可能正在提供有关该问题的更多信息.

更新WebSocket实现: 确保您使用的WebSocket库与您的服务器兼容.如果您使用的是第三方库(如ws),请确保它支持服务器所需的功能.

下面是一个如何将错误处理添加到现有代码的示例:

const response = ws.connect(url, params, function (socket) {
  socket.on("open", function open() {
    console.log("WebSocket connection established.");

    // Send the GraphQL message
    socket.send(JSON.stringify(message));
  });

  socket.on("message", function incoming(data) {
    console.log("Received message:", data);
  });

  socket.on("error", function (error) {
    console.error("WebSocket error:", error);
  });
});

通过添加错误处理,您可以收集有关可能导致问题的原因的更多信息.如果问题仍然存在,判断服务器的文档或联系服务器的支持以获得帮助可能会有所帮助.

Javascript相关问答推荐

如何在Angular中插入动态组件

在网页上添加谷歌亵渎词

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

使用Java脚本根据按下的按钮更改S文本

Ember.js 5.4更新会话存储时如何更新组件变量

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

使用ThreeJ渲染的形状具有抖动/模糊的边缘

如何在coCos2d-x中更正此错误

按下单键和多值

使用插件构建包含chart.js提供程序的Angular 库?

Reaction-SWR-无更新组件

如何在Java脚本中对列表中的特定元素进行排序?

Google脚本数组映射函数横向输出

如何找到带有特定文本和测试ID的div?

如果对象中的字段等于某个值,则从数组列表中删除对象

在没有任何悬停或其他触发的情况下连续交换图像

如何正确地在ComponentWillUnmount中卸载状态以避免内存泄漏?

找不到处于状态的联系人

使用jQuery每隔几秒钟突出显示列表中的不同单词

递归地将JSON对象的内容上移一级