7

RelayGraphQLを試しています。私がスキーマをやっているとき、私はこれをやっています:

let articleQLO = new GraphQLObjectType({
  name: 'Article',
  description: 'An article',
  fields: () => ({
    _id: globalIdField('Article'),
    title: {
      type: GraphQLString,
      description: 'The title of the article',
      resolve: (article) => article.getTitle(),
    },
    author: {
      type: userConnection,
      description: 'The author of the article',
      resolve: (article) => article.getAuthor(),
    },
  }),
  interfaces: [nodeInterface],
})

だから、このような記事を頼むと:

{
  article(id: 1) {
    id,
    title,
    author
  }
}

データベースに対して 3 つのクエリを実行しますか? つまり、各フィールドには、データベースへのリクエストを行う解決メソッド ( getTitlegetAuthorなど) があります。私はこれを間違っていますか?

これは例ですgetAuthor(私はマングースを使用しています):

articleSchema.methods.getAuthor = function(id){
  let article = this.model('Article').findOne({_id: id})
  return article.author
}
4

1 に答える 1

4

resolveメソッドが渡された場合article、プロパティにアクセスすることはできませんか?

let articleQLO = new GraphQLObjectType({
  name: 'Article',
  description: 'An article',
  fields: () => ({
    _id: globalIdField('Article'),
    title: {
      type: GraphQLString,
      description: 'The title of the article',
      resolve: (article) => article.title,
    },
    author: {
      type: userConnection,
      description: 'The author of the article',
      resolve: (article) => article.author,
    },
  }),
  interfaces: [nodeInterface],
})

Schema.methodsMongoose ではモデルでメソッドを定義するため、記事の ID は必要ありません (記事のインスタンスで呼び出すため)。したがって、メソッドを保持したい場合は、次のようにします。

articleSchema.methods.getAuthor = function() {
  return article.author;
}

たとえば、別のコレクションで検索する必要がある場合、別のクエリを実行する必要があります (参照を使用していないと仮定します)。

articleSchema.methods.getAuthor = function(callback) {
  return this.model('Author').find({ _id: this.author_id }, cb);
}
于 2015-08-26T15:16:31.630 に答える