2017-09-04 80 views
0

總之,該解析器getAllArticles()返回物品系列,並且每篇文章都有一個作者字段和標籤領域,使每篇文章能發射子分解器來獲取這些數據,但我無法查看和找到最佳解決方案。如何通過DB連接到子解析器當根解析器返回一個迭代

你必須知道一些背景故事:

app.js

我傳遞的DB連接到頂級解析器爲根值的地圖。

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

我通過分配它們到響應對象傳遞分貝連接到子解析器。

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

這個工作優秀(代碼變得非常乾淨),直到我搬到了getAllArticles()解析器返回文章數組。我看不到如何附上地圖。

getAllArticles.js

這裏就是立刻直觀的補充:

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

這並不工作,並看着它,爲什麼會之後?子分解器從父對象獲取數據,這是本例中的每篇文章。

回答

0

一些迭代之後,這裏是可行的解決方案:

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 
} 

希望這可以幫助別人的未來。我非常喜歡將DB驅動程序連接傳遞給解析器的方法。它收緊了整體架構,並允許我輕鬆地啓動額外的解決方案,因爲它們包含電池。

如果您將數據庫連接傳遞到GraphQL上下文參數中,只要確保您傳入包含數據庫連接的映射而不是對象。 DB連接中的某些值是函數。地圖能夠處理。對象不是。除非你傳遞一個Map,否則你可能會在你的子解析器中看到與DB連接有關的可怕的模糊引爆。

+1

你可以只通過該數據庫連接到你的背景下,而不是利用根值。這將使所有你的解析器都可用,而無需額外的工作。 –

+0

你知道,現在我聽到你說了,我想我記得一些來自Apollo Server的文檔,他說這樣做建議不要將它傳遞給根值。我會盡力找到它。謝謝。 – agm1984

+0

我什麼都看不到,但是這個頁面是我在想的地方:http://dev.apollodata。com/tools/apollo-server/setup.html。我很肯定你是發現的,因爲我知道我已經閱讀過指出這一點的文檔,在那些日子裏,我閱讀了數百篇關於GraphQL的文章:)我認爲Jonas Helfer或Lee Byron明確地說過它。我想,使用'context'將會是一個相當直接的改進。我會用結果更新我的帖子。 – agm1984