Apollo Graphql Subscriptions:为创建、更新和删除使用不同的订阅解析器,还是使用一个解析器?
创始人
2024-09-09 02:30:44
0

针对"Apollo GraphQL Subscriptions: Use separate subscription resolvers for create, update, and delete or use a single resolver?"的问题,以下是两种解决方法的示例代码:

  1. 使用单个订阅解析器:
const { ApolloServer, PubSub } = require('apollo-server');
const pubsub = new PubSub();

const typeDefs = `
  type Message {
    id: ID!
    content: String!
  }

  type Query {
    messages: [Message]
  }

  type Mutation {
    createMessage(content: String!): Message
    updateMessage(id: ID!, content: String!): Message
    deleteMessage(id: ID!): ID
  }

  type Subscription {
    messageCreated: Message
    messageUpdated: Message
    messageDeleted: ID
  }
`;

const messages = [];

const resolvers = {
  Query: {
    messages: () => messages,
  },
  Mutation: {
    createMessage: (_, { content }) => {
      const newMessage = { id: messages.length + 1, content };
      messages.push(newMessage);
      pubsub.publish('MESSAGE_CREATED', { messageCreated: newMessage });
      return newMessage;
    },
    updateMessage: (_, { id, content }) => {
      const messageIndex = messages.findIndex(message => message.id === id);
      if (messageIndex === -1) {
        throw new Error('Message not found');
      }
      const updatedMessage = { ...messages[messageIndex], content };
      messages[messageIndex] = updatedMessage;
      pubsub.publish('MESSAGE_UPDATED', { messageUpdated: updatedMessage });
      return updatedMessage;
    },
    deleteMessage: (_, { id }) => {
      const messageIndex = messages.findIndex(message => message.id === id);
      if (messageIndex === -1) {
        throw new Error('Message not found');
      }
      messages.splice(messageIndex, 1);
      pubsub.publish('MESSAGE_DELETED', { messageDeleted: id });
      return id;
    },
  },
  Subscription: {
    messageCreated: {
      subscribe: () => pubsub.asyncIterator('MESSAGE_CREATED'),
    },
    messageUpdated: {
      subscribe: () => pubsub.asyncIterator('MESSAGE_UPDATED'),
    },
    messageDeleted: {
      subscribe: () => pubsub.asyncIterator('MESSAGE_DELETED'),
    },
  },
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});
  1. 使用不同的订阅解析器:
const { ApolloServer, PubSub } = require('apollo-server');
const pubsub = new PubSub();

const typeDefs = `
  type Message {
    id: ID!
    content: String!
  }

  type Query {
    messages: [Message]
  }

  type Mutation {
    createMessage(content: String!): Message
    updateMessage(id: ID!, content: String!): Message
    deleteMessage(id: ID!): ID
  }

  type Subscription {
    messageCreated: Message
    messageUpdated(id: ID!): Message
    messageDeleted(id: ID!): ID
  }
`;

const messages = [];

const resolvers = {
  Query: {
    messages: () => messages,
  },
  Mutation: {
    createMessage: (_, { content }) => {
      const newMessage = { id: messages.length + 1, content };
      messages.push(newMessage);
      pubsub.publish('MESSAGE_CREATED', { messageCreated: newMessage });
      return newMessage;
    },
    updateMessage: (_, { id, content }) => {
      const messageIndex = messages.findIndex(message => message.id === id);
      if (messageIndex === -1) {
        throw new Error('Message not found');
      }
      const updatedMessage = { ...messages[messageIndex], content };
      messages[messageIndex] = updatedMessage;
      pubsub.publish('MESSAGE_UPDATED', { messageUpdated: updatedMessage });
      return updatedMessage;
    },
    deleteMessage: (_, { id }) => {
      const messageIndex = messages.findIndex(message => message.id === id);
      if (messageIndex === -1) {
        throw new Error('Message not found');
      }
      messages.splice(messageIndex, 1);
      pubsub.publish('MESSAGE_DELETED', { messageDeleted: id });
      return id;
    },
  },
  Subscription: {
    messageCreated: {
      subscribe: () => pubsub.asyncIterator('MESSAGE_CREATED'),
    },
    messageUpdated: {
      subscribe: (_, { id }) => pubsub.asyncIterator(`MESSAGE_UPDATED_${id}`),
    },
    messageDeleted: {
      subscribe: (_, { id }) => pubsub.asyncIterator(`MESSAGE_DELETED_${id}`

相关内容

热门资讯

1分钟了解(Wepokeapp... 1分钟了解(Wepokeapp)外挂透明挂辅助工具(辅助挂)辅助透视(有挂秘笈)-哔哩哔哩;科技详细...
透明挂透视(weopke真的有... WePoker透视辅助版本解析‌,透明挂透视(weopke真的有挂)外挂透明挂辅助工具(辅助挂)德州...
揭秘(Wepoke ai代打)... 揭秘(Wepoke ai代打)外挂透明挂辅助软件(透视)原来是真的有挂(2020已更新)(哔哩哔哩)...
透明肯定!德扑之星自定义(we... 透明肯定!德扑之星自定义(wepOkE)外挂透明挂辅助APP(辅助挂)AI教程(揭秘有挂)-哔哩哔哩...
终于知道(WPK)外挂透明挂辅... 终于知道(WPK)外挂透明挂辅助插件(辅助挂)软件透明挂(有人有挂)-哔哩哔哩;亲真的是有正版授权,...
科技通报(Wepoke大厅房)... 科技通报(Wepoke大厅房)外挂透明挂辅助工具(透视)德州ai机器人(有挂方略)-哔哩哔哩;Wep...
玩家交流(WPK教程)外挂透明... 《WPK教程软件透明挂》是一款多人竞技的WPK教程辅助透视游戏,你将微扑克对手来到同一个战场,为至高...
科技分享!wepoke真的(w... wepoke真的新手教程相关信息汇总(需添加指定薇757446909获取下载链接);科技分享!wep...
关于(德扑之星机制)外挂透明挂... 《关于(德扑之星机制)外挂透明挂辅助app(透视)辅助透视(有挂细节)-哔哩哔哩》 德扑之星机制软件...
透视好友(aapoker规律)... 透视好友(aapoker规律)外挂透明挂辅助脚本(透视)发牌规律(果真有挂)-哔哩哔哩;aapoke...