2016-09-02 1 views
1

Ich versuche, eine REST-Abfrage mit GraphQL und Apollo aufzulösen.Wie kann ich eine Abfrage verwenden, um viele Rest-Rundreisen in graphQL aufzulösen?

Meine Rest Daten wie folgt aussieht

zu einem Spagat Resolver einen Fonds ID Pass, die eine zurückgibt -> [Splits array] -> jeder Split ein donation_id hat -> Ich möchte, dass ID nutzen, um die { Spende} Objekt aus einem separaten Ruhe Endpunkt

hier ist mein Schema

export const schema = [` 

schema { 
    query: RootQuery 
} 

type RootQuery { 
    Splits(id: Int!): [Splits] 
} 

type Splits { 
    amount_in_cents:Int 
    donation_id:Int 
    fund_id:Int 
    id:Int 
    memo:String 
    donation(donation_id: Int): Donation 
} 

type Donation { 
    amount_in_cents: Int 
    bank_name: String 
} 
`]; 

Und hier ist meine Resolver-Datei

import rp from 'request-promise'; 

const DTBaseURL = 'https://restendpointdomainhere.com/'; 
const getFromDT = (getQuery) => { 
    const data = rp(DTBaseURL + getQuery, { 
    'auth': { 
     "user": Meteor.settings.endpoint.user, 
     "pass": Meteor.settings.endpoint.pass, 
    } 
    }) 
    .then((res) => JSON.parse(res)) 
    .then((res) =>{ 
     return res; 
    }); 
    return data; 
}; 



export default resolveFunctions = { 
    RootQuery: { 
    Splits(root, args, context){ 
     let newValue = []; 
     const getQuery = 'funds/' + args.id + '/splits.json'; 

     const data = getFromDT(getQuery) 
     .then((res) => { 
      res.forEach(function (donationSplit) { 
      newValue.push(donationSplit.split); 
      }); 
      return newValue; 
     }); 

     return data; 
    }, 
    donation(root, args, context){ 
     console.log(args); 
     const getQuery = 'donations/' + args.donation_id + '.json'; 

     const data = getFromDT(getQuery) 
     .then((res) => { 
      return res.donation; 
     }); 
     return data; 
    } 
    } 
}; 

Jede Abfrage, die ich mache @/graphql ruft mir diese Fehlermeldung.

{ 
    "errors": [ 
    { 
     "message": "Resolve function missing for \"Splits.donation\"" 
    } 
    ] 
} 

Jede Hilfe hier wird geschätzt.

Antwort

2

Es sieht so aus, als ob Sie mit graphql-tools Ihr Schema erstellen. Diese Fehlermeldung weist Sie darauf hin, dass Ihr Schema nicht erfolgreich erstellt werden kann, da das Feld donation auf Splits eine Auflösungsfunktion benötigt. Sie haben die Auflösungsfunktion definiert, aber Sie geben sie in RootQuery anstelle von Splits ein, wo sie hingehört:

export default resolveFunctions = { 
    RootQuery: { 
    Splits(root, args, context){ 
     let newValue = []; 
     const getQuery = 'funds/' + args.id + '/splits.json'; 

     const data = getFromDT(getQuery) 
     .then((res) => { 
      res.forEach(function (donationSplit) { 
      newValue.push(donationSplit.split); 
      }); 
      return newValue; 
     }); 

     return data; 
    }, 
    }, 
    Splits: { // <<---- you forgot this ------ 
    donation(root, args, context){ 
     console.log(args); 
     const getQuery = 'donations/' + args.donation_id + '.json'; 

     const data = getFromDT(getQuery) 
     .then((res) => { 
      return res.donation; 
     }); 
     return data; 
    } 
    }, 
}; 
+0

Danke. Wie kann ich die donation_id nun von der Abfrageantwort in diesen Resolver übergeben? Hier ist, was ich habe in GraphiQL { Splits (id: 71455) { amount_in_cents donation_id Spende (donation_id: donation_id) { amount_in_cents } } } – JoshJoe

+0

die 'donation' Resolver wird das Objekt erhalten, die Sie Als erstes Argument wird der Resolver 'Splits' und als zweites Argument alle GraphQL-Argumente (einschließlich donation_id) zurückgegeben. – helfer

+1

Aus Ihrer Beschreibung geht hervor, dass Sie das Argument donation_id nicht einmal in Ihrem Feld benötigen, da jeder Split genau eine Spende hat, also kann die spenden_id Teil des geteilten Objekts sein, das der Spende-Resolver als erstes Argument bekommt. – helfer

Verwandte Themen