针对"Apollo GraphQL Subscriptions: Use separate subscription resolvers for create, update, and delete or use a single resolver?"的问题,以下是两种解决方法的示例代码:
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}`);
});
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}`