2017-08-19 9 views
0

Ich versuche den neu hinzugefügten Beitrag zu veröffentlichen, aber die Felder author und voteCount, die benutzerdefinierte Felder sind und einen anderen Typ verweisen, wurden nicht veröffentlicht, sodass ich für diese Felder nicht definiert wurde.Benutzerdefiniertes Feld wird nicht im Subskriptions-Apollo-Server veröffentlicht

Mein Schema:

type Post { 
    id: ID! 
    title: String! 
    content: String 
    voteCount: Int! 
    author: User! 
    votes: [Vote!]! 
    createdAt: Date! 
    updatedAt: Date! 
    } 
type Subscription { 
    Post(filter: PostSubscriptionFilter): PostSubscriptionPayload 
    } 
    input PostSubscriptionFilter { 
    mutation_in: [_ModelMutationType!] 
    } 
    type PostSubscriptionPayload { 
    mutation: _ModelMutationType! 
    node: Post 
    } 
    enum _ModelMutationType { 
    CREATED 
    UPDATED 
    DELETED 
    } 

Resolver

Mutation: { 
    addPost: async (
     root, 
     { title, content }, 
     { ValidationError, models: { Post }, user }, 
    ) => { 
     if (!user) { 
     throw new ValidationError('unauthorized'); 
     } 
     const post = new Post({ 
     title, 
     content, 
     author: user.id, 
     }); 
     await post.save(); 
     pubsub.publish('Post', { Post: { mutation: 'CREATED', node: post } }); 
     return post; 
    }, 
}, 
Subscription: { 
    Post: { 
     subscribe:() => pubsub.asyncIterator('Post'), 
    }, 
    }, 
Post: { 
    // eslint-disable-next-line no-underscore-dangle 
    id: root => root.id || root._id, 
    author: async ({ author }, data, { dataLoaders: { userLoader } }) => { 
     const postAuthor = await userLoader.load(author); 
     return postAuthor; 
    }, 
    voteCount: async ({ _id }, data, { models: { Vote } }) => { 
     const voteCount = await Vote.find({ post: _id }).count(); 
     return voteCount || 0; 
    }, 
    votes: async ({ _id }, data, { models: { Vote } }) => { 
     const postVotes = await Vote.find({ post: _id }); 
     return postVotes || []; 
    }, 
    }, 

Und das Abonnement in Reaktion Client:

componentWillMount() { 
    this.subscribeToNewPosts(); 
    } 
subscribeToNewPosts() { 
    this.props.allPostsQuery.subscribeToMore({ 
     document: gql` 
     subscription { 
      Post(filter: { mutation_in: [CREATED] }) { 
      node { 
       id 
       title 
       content 
       updatedAt 
       voteCount 
      } 
      } 
     } 
     `, 
     updateQuery: (previous, { subscriptionData }) => { 
     // const result = Object.assign({}, previous, { 
     // allPosts: [subscriptionData.data.Post.node, ...previous.allPosts], 
     // }); 
     // return result; 
     console.log(subscriptionData); 
     return previous; 
     }, 
    }); 
    } 

Das Feld voteCount ist nicht definiert: enter image description here

Während Abfragen oder Mutationen normal veröffentlicht werden, was soll ich tun? Vielen Dank.

Antwort

1

Der Fehler, den Sie sehen, bedeutet nicht unbedingt, dass voteCount Null ist - es bedeutet vielmehr, dass Sie versuchen, einen undefinierten Wert anstelle eines Objekts zu destrukturieren. Der Pfad zeigt Ihnen an, dass dieser Fehler beim Auflösen von voteCount aufgetreten ist. Sie verwenden die Destrukturierung innerhalb Ihrer Auflösungsfunktion an zwei Stellen - einmal mit dem Stammobjekt und einmal mit Kontext. Es sollte ein Root-Objekt mit Ihnen zu arbeiten geben, so stelle ich mir vor, das Problem ist mit Kontext.

Wenn Sie den Kontext für einen typischen GraphQL-Server einrichten, verwenden Sie Middleware (wie graphqlExpress), um sie im Wesentlichen in die Anforderung einzufügen, die Sie erstellen. Wenn Sie Subskriptionen verwenden, wird alles über Websockets ausgeführt, so dass die Middleware nie getroffen wird und Ihr Kontext daher null ist.

Um dies zu umgehen, denke ich, dass Sie den gleichen Kontext in Ihre Abonnements injizieren müssen - Sie können an example of how to do that here sehen.

+0

OMG! Du hast meinen Tag gerettet! Ich danke dir sehr! –

Verwandte Themen