You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

graphql-ws subscribeToMore的updateQuery回调未触发排查

问题描述

使用subscribeToMore实现GraphQL查询结果自动更新时代码无法正常执行,已验证query、mutation、subscribe三类操作均可独立正常运行,判断是subscribeToMore的updateQuery回调未触发,不清楚调试定位方法。

相关代码

前端代码

GraphQL操作定义

export const QUERY_MESSAGES = gql`
  query Messages($convoId: ID!) {
    messages(convoId: $convoId) {
      text
      senderId
      convoId
      createdAt
    }
  }
`;

export const SUBSCRIBE_MESSAGES = gql`
  subscription Messages($convoId: ID!) {
    messages(convoID: $convoID) {
      text
      convoId
    }
  }
`;

活跃聊天容器组件

const ActiveChat = ({ currentConvo, me }: any) => {
  const { subscribeToMore, data } = useQuery(QUERY_MESSAGES, {
    variables: {
      convoId: currentConvo,
    },
  });


  return (
    <section className="chat-wrapper">

      <div className="messages-container">
        <Messages
          messages={data.messages}
          me={me}
          subscribeToMessages={() => {
            subscribeToMore({
              document: SUBSCRIBE_MESSAGES,
              variables: { convoId: currentConvo },
              updateQuery: (prev, { subscriptionData }) => {
                console.log("hit");
                if (!subscriptionData.data) return prev;
                const newFeedItem = subscriptionData.data.messages;

                return Object.assign({}, prev, {
                  messages: [newFeedItem, ...prev.messages],
                });
              },
            });
          }}
        />
        <Input currentConvo={currentConvo} />
      </div>
    </section>
  );
};

消息列表组件

const Messages = ({ messages, me, subscribeToMessages }: any) => {
  useEffect(() => {
    subscribeToMessages();
    console.log("use effect ran");
  });

  const formatTime = (time: number) =>
    new Date(time * 1000).toLocaleTimeString();
  console.log(messages);
  return (
    messages && (
      <div>
        {messages.map((message: any, i: number) => {
          return message.senderId === me?._id ? (
            <SenderBubble
              key={i}
              text={message.text}
              time={message.createdAt}
              formatTime={formatTime}
            />
          ) : (
            <OtherUserBubble
              key={i}
              text={message.text}
              time={message.createdAt}
              formatTime={formatTime}
            />
          );
        })}
      </div>
    )
  );
};

后端代码

const pubsub = new PubSub();
  Query: {
 
    messages: async (parent, { convoId }, context) => {
      if (context.user) {
        return Message.find({ convoId }).sort({ createdAt: "asc" });
      }
    },
  },

  Mutation: {

    /// 创建新消息,关联发送者ID并触发MESSAGE_SENT事件
    sendMessage: async (parent, { text, convoId }, context) => {
      pubsub.publish("MESSAGE_SENT", {
        message: { text, convoId },
      });

      return Message.create({ text, convoId, senderId: context.user._id });
    },

   
  },
  Subscription: {
    userActive: {
      subscribe: () => pubsub.asyncIterator("ACTIVE_USERS"),
    },
    message: {
      subscribe: withFilter(
        () => pubsub.asyncIterator("MESSAGE_SENT"),
        (payload, variables) => {
          return payload.message.convoId === variables.convoId;
        }
      ),
    },
  },
问题结论

已解决:经排查,问题根因为客户端构建时配置的WebSocket服务url与端口号错误,导致ws连接未成功建立。


内容的提问来源于stack exchange,提问作者Blake McCarty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 13:33:22