2015-08-26 15 views
7

Ich probiere Relay und GraphQL aus. Wenn ich das Schema mache ich das tue:Wie funktioniert Relay/GraphQL 'resolve'?

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

Also, wenn ich für einen Artikel wie diesen fragen:

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

Wird es tun 3 Anfragen an die Datenbank? Ich meine, jedes Feld hat eine resolve-Methode (getTitle, getAuthor ...), die eine Anfrage an die Datenbank stellt. Mache ich das falsch?

Dies ist ein Beispiel für getAuthor (ich benutze Mungo):

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

Antwort

4

Wenn die resolve Methode, um die article übergeben wird, können Sie nicht nur die Eigenschaft zugreifen?

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

Da Schema.methods in Mongoose Methoden auf dem Modell definiert, wäre es nicht eine ID für den Artikel nehmen (weil Sie es auf einem Artikel Instanz aufrufen). Also, wenn Sie die Methode halten wollen, würden Sie gerade tun:

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

Wenn es etwas ist, was Sie brauchen zum Beispiel zu sehen in einer anderen Sammlung, , dann müssen Sie eine separate Abfrage durchführen (vorausgesetzt, Sie verwenden keine Referenzen):

articleSchema.methods.getAuthor = function(callback) { 
    return this.model('Author').find({ _id: this.author_id }, cb); 
}