将 Apollo 连接到 mongodb
Connect Apollo with mongodb
我想将我的 Apollo 服务器连接到我的 mongoDB。我知道那里有很多例子,但我卡在了异步部分,没有找到解决方案或例子(这很奇怪,我完全错了吗?)
我从 next.js https://github.com/zeit/next.js/tree/master/examples/api-routes-apollo-server-and-client 的例子开始。
但是缺少 mongodb 集成。
我的代码
pages/api/graphql.js
import {ApolloServer} from 'apollo-server-micro';
import {schema} from '../../apollo/schema';
const apolloServer = new ApolloServer({schema});
export const config = {
api: {
bodyParser: false
}
};
export default apolloServer.createHandler({path: '/api/graphql'});
apollo/schema.js
import {makeExecutableSchema} from 'graphql-tools';
import {typeDefs} from './type-defs';
import {resolvers} from './resolvers';
export const schema = makeExecutableSchema({
typeDefs,
resolvers
});
apollo/resolvers.js
const Items = require('./connector').Items;
export const resolvers = {
Query: {
item: async (_parent, args) => {
const {id} = args;
const item = await Items.findOne(objectId(id));
return item;
},
...
}
}
apollo/connector.js
require('dotenv').config();
const MongoClient = require('mongodb').MongoClient;
const password = process.env.MONGO_PASSWORD;
const username = process.env.MONGO_USER;
const uri = `mongodb+srv://${username}:${password}@example.com`;
const client = await MongoClient.connect(uri);
const db = await client.db('databaseName')
const Items = db.collection('items')
module.exports = {Items}
所以问题是 connector.js
中的 await
。我不知道如何在异步函数中调用它或如何以其他方式向解析器提供 MongoClient。如果我只是删除 await
,它 returns – 显然 – 一个未决的承诺并且不能调用函数 .db('databaseName')
它。
不幸的是,我们离 top-level await.
还有很长的路要走
您可以延迟 运行 其余代码,直到 Promise 解决,方法是将其放入 Promise 的 then
回调中。
async function getDb () {
const client = await MongoClient.connect(uri)
return client.db('databaseName')
}
getDb()
.then(db => {
const apollo = new ApolloServer({
schema,
context: { db },
})
apollo.listen()
})
.catch(e => {
// handle any errors
})
或者,您可以在第一次需要时创建连接并缓存它:
let db
const apollo = new ApolloServer({
schema,
context: async () => {
if (!db) {
try {
const client = await MongoClient.connect(uri)
db = await client.db('databaseName')
catch (e) {
// handle any errors
}
}
return { db }
},
})
apollo.listen()
我想将我的 Apollo 服务器连接到我的 mongoDB。我知道那里有很多例子,但我卡在了异步部分,没有找到解决方案或例子(这很奇怪,我完全错了吗?)
我从 next.js https://github.com/zeit/next.js/tree/master/examples/api-routes-apollo-server-and-client 的例子开始。 但是缺少 mongodb 集成。
我的代码
pages/api/graphql.js
import {ApolloServer} from 'apollo-server-micro';
import {schema} from '../../apollo/schema';
const apolloServer = new ApolloServer({schema});
export const config = {
api: {
bodyParser: false
}
};
export default apolloServer.createHandler({path: '/api/graphql'});
apollo/schema.js
import {makeExecutableSchema} from 'graphql-tools';
import {typeDefs} from './type-defs';
import {resolvers} from './resolvers';
export const schema = makeExecutableSchema({
typeDefs,
resolvers
});
apollo/resolvers.js
const Items = require('./connector').Items;
export const resolvers = {
Query: {
item: async (_parent, args) => {
const {id} = args;
const item = await Items.findOne(objectId(id));
return item;
},
...
}
}
apollo/connector.js
require('dotenv').config();
const MongoClient = require('mongodb').MongoClient;
const password = process.env.MONGO_PASSWORD;
const username = process.env.MONGO_USER;
const uri = `mongodb+srv://${username}:${password}@example.com`;
const client = await MongoClient.connect(uri);
const db = await client.db('databaseName')
const Items = db.collection('items')
module.exports = {Items}
所以问题是 connector.js
中的 await
。我不知道如何在异步函数中调用它或如何以其他方式向解析器提供 MongoClient。如果我只是删除 await
,它 returns – 显然 – 一个未决的承诺并且不能调用函数 .db('databaseName')
它。
不幸的是,我们离 top-level await.
还有很长的路要走您可以延迟 运行 其余代码,直到 Promise 解决,方法是将其放入 Promise 的 then
回调中。
async function getDb () {
const client = await MongoClient.connect(uri)
return client.db('databaseName')
}
getDb()
.then(db => {
const apollo = new ApolloServer({
schema,
context: { db },
})
apollo.listen()
})
.catch(e => {
// handle any errors
})
或者,您可以在第一次需要时创建连接并缓存它:
let db
const apollo = new ApolloServer({
schema,
context: async () => {
if (!db) {
try {
const client = await MongoClient.connect(uri)
db = await client.db('databaseName')
catch (e) {
// handle any errors
}
}
return { db }
},
})
apollo.listen()