總之,該解析器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 })
}
這並不工作,並看着它,爲什麼會之後?子分解器從父對象獲取數據,這是本例中的每篇文章。
你可以只通過該數據庫連接到你的背景下,而不是利用根值。這將使所有你的解析器都可用,而無需額外的工作。 –
你知道,現在我聽到你說了,我想我記得一些來自Apollo Server的文檔,他說這樣做建議不要將它傳遞給根值。我會盡力找到它。謝謝。 – agm1984
我什麼都看不到,但是這個頁面是我在想的地方:http://dev.apollodata。com/tools/apollo-server/setup.html。我很肯定你是發現的,因爲我知道我已經閱讀過指出這一點的文檔,在那些日子裏,我閱讀了數百篇關於GraphQL的文章:)我認爲Jonas Helfer或Lee Byron明確地說過它。我想,使用'context'將會是一個相當直接的改進。我會用結果更新我的帖子。 – agm1984