Соедините Аполлона с mongodb - PullRequest
       22

Соедините Аполлона с mongodb

1 голос
/ 29 февраля 2020

Я хочу подключить свой сервер Apollo к моей mongoDB. Я знаю, что есть много примеров, но я застрял в части asyn c и не нашел решения или примера для этого (странно, я совершенно не прав?)

Я начал с пример из следующего. js https://github.com/zeit/next.js/tree/master/examples/api-routes-apollo-server-and-client. Но интеграция с mongodb отсутствует.

Мой код

страниц / 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}

Итак, проблема в await в connector.js. Я понятия не имею, как вызвать это в asyn c функции или как обеспечить MongoClient другим способом для распознавателя. Если я просто удаляю await, он возвращает - очевидно - ожидающее обещание и не может вызвать функцию .db('databaseName') для него.

1 Ответ

1 голос
/ 29 февраля 2020

К сожалению, мы все еще далеки от того, чтобы ждать на верхнем уровне .

. Вы можете отложить выполнение остального кода до разрешения Promise, поместив его в then обратный вызов Promise.

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()
...