2017-09-04 2 views
0

Kurz gesagt, dieser Resolver getAllArticles() gibt ein Array von Artikeln zurück, und jeder Artikel hat ein Autorenfeld und ein Tags-Feld, so dass jeder Artikel auslösen kann Sub-Resolver, um diese Daten zu bekommen, aber ich hatte Probleme, die beste Lösung zu finden und zu finden.Wie DB-Verbindung zu einem Sub-Resolver übergeben wird, wenn der Root-Resolver eine iterable zurückgibt

Sie haben einige Hintergrundgeschichten wissen:

app.js

Ich bin vorbei an den DB-Verbindungen in die Top-Level-Resolver als eine Karte im Wurzelwert.

const db = new Map() 
db.set('Neo4J', Neo4J.getDriver()) 
db.set('MongoDB', MongoDB.getDB()) 

// GraphQL Endpoint 
app.use('/graphql', bodyParser.json(), graphqlExpress((req) => { 
    // ... 
    return { 
     schema, 
     context, 
     rootValue: { 
      db 
     } 
    } 
})) 

getArticle.js

Ich bin vorbei an den DB-Verbindungen zu den Unter Resolvern, indem sie auf das Response-Objekt zuweisen.

const getArticle = async (root, args, context) => { 
    const db = root.db 
    const Neo4J = db.get('Neo4J') 
    const MongoDB = db.get('MongoDB') 
    // ... 
    const article = { /* ... */ } 
    return Object.assign({}, article , { db }) 
} 

Das funktionierte sehr gut (Code extrem sauber geworden), bis ich zum getAllArticles() Resolver bewegt, die ein Array von Artikeln zurückgibt. Ich konnte nicht sehen, wie man die db Karte anbringt.

getAllArticles.js

Hier ist, was sofort intuitiv war hinzuzufügen:

const getAllArticles = async (root, args, context) => { 
    const db = root.db 
    const Neo4J = db.get('Neo4J') 
    const MongoDB = db.get('MongoDB') 
    // ... 
    const articles = [{ /* ... */ }, { /* ... */ }, { /* ... */ }] 
    return Object.assign({}, articles, { db }) 
} 

, die nicht funktionierten, und nachdem es zu betrachten, warum sollte es? Sub-Resolver nehmen die Daten vom übergeordneten Objekt, das in diesem Fall jeder Artikel ist.

Antwort

0

Nach einigen Iterationen, hier ist die praktikable Lösung:

app.js

import Neo4J from './connectors/neo4j' 
import MongoDB from './connectors/mongodb' 
const db = new Map([ 
    ['Neo4J', Neo4J.getDriver()], 
    ['MongoDB', MongoDB.getDB()] 
]) 

app.use('/graphql', bodyParser.json(), graphqlExpress((req) => { 
    const context = { 
     settings: { SECRET }, 
     person: req.person, 
     db 
    } 
    return { 
     schema, 
     context, 
     rootValue: null 
    } 
})) 

everyResolver.js

const getSomething = async (root, args, context, info) => { 
    const db = context.db 
    const Neo4J = db.get('Neo4J') 
    const MongoDB = db.get('MongoDB') 

    const session = Neo4J.session() 
    session.run(query) // etc 

    const users = MongoDB.collection('users') 
    users.findOne(ObjectID(id)) // etc 

    return objectOrIterable 
} 

Hoffentlich kann dies jemand anderes helfen die Zukunft. Ich mag den Ansatz, die DB-Treiberverbindungen an die Resolver weiterzuleiten. Es hat die Gesamtarchitektur verschärft und erlaubt mir, zusätzliche Resolver einfach zu starten, da sie mit Batterien geliefert werden.

Wenn Sie DB-Verbindungen in den GraphQL-Kontextparameter übergeben, stellen Sie nur sicher, dass Sie eine Map mit den DB-Verbindungen und kein Objekt übergeben. Einige Werte in den DB-Verbindungen sind Funktionen. Karten können damit umgehen. Objekte sind nicht. Möglicherweise sehen Sie schrecklich zweideutige Detonationen in Verbindung mit den DB-Verbindungen in Ihren Sub-Resolvern, es sei denn, Sie umgehen eine Map.

+1

Sie könnten die db-Verbindung einfach in Ihren Kontext übergeben, anstatt den Root-Wert zu verwenden. Dadurch wird es für alle Resolver ohne zusätzliche Arbeit verfügbar. –

+0

Weißt du, jetzt, wo ich dich das sagen höre, denke ich, dass ich eine Dokumentation von Apollo Server gelesen habe, in der es heißt, dass es empfohlen wird, dies im Wurzelwert zu tun. Ich werde versuchen, es zu finden. Vielen Dank. – agm1984

+0

Ich sehe nichts, aber diese Seite ist, wo ich dachte: http: //dev.apollodata.com/tools/apollo-server/setup.html. Ich bin mir ziemlich sicher, dass Sie genau da sind, weil ich weiß, dass ich Dokumentation gelesen habe, die darauf hinweist, an einem dieser Tage las ich Hunderte von Artikeln über GraphQL :) Ich denke, Jonas Helfer oder Lee Byron sagen es explizit irgendwo. Ich stelle mir vor, dass es eine ziemlich direkte Verbesserung sein wird, Kontext zu verwenden. Ich werde meinen Beitrag mit den Ergebnissen aktualisieren. – agm1984

Verwandte Themen