2017-08-19 6 views
0

新しく追加された投稿を公開しようとしていますが、カスタムフィールドで参照する別のタイプの参照であるフィールドauthorvoteCountは公開されていません。カスタムフィールドがサブスクリプションapolloサーバーに公開されない

マイスキーマ:

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 
    } 

リゾルバ

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 || []; 
    }, 
    }, 

およびサブスクリプションでは、クライアントに反応:

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; 
     }, 
    }); 
    } 

フィールドvoteCountは未定義です: enter image description here

クエリや突然変異を使用している間、正常に公開されますが、どうすればよいですか?ありがとうございました。

答えて

1

表示されているエラーは、必ずしもvoteCountがヌルであるという意味ではなく、オブジェクトではなく未定義の値をデストラクトしようとしていることを意味します。パスは、voteCountを解決しようとしているときにこのエラーが発生したことを示します。解決関数内では、ルートオブジェクトを使用して1回、コンテキストを使用して2か所で構造化を使用します。作業にはルートオブジェクトが必要です。そのため、この問題はコンテキストに関係していると思います。

一般的なGraphQLサーバのコンテキストを設定する場合は、ミドルウェア(graphqlExpressなど)を利用して、基本的にそれを作成している要求に挿入します。サブスクリプションを使用すると、すべてがWebSocketを介して行われるため、ミドルウェアは決してヒットしないため、コンテキストはnullです。

これを回避するには、サブスクリプションに同じコンテキストを注入する必要があると思います。an example of how to do that hereが表示されます。

+0

OMG!あなたは私の一日を救った!どうもありがとうございます! –

関連する問題