Express -graphql "Невозможно прочитать свойство 'collection' из undefined" с mongodb при выполнении мутации и запроса - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь запросить и мутацию в графе QL с express -graphql, node и mongodb. Как для запроса, так и для мутации я получаю «Невозможно прочитать свойство 'collection' of undefined». Я go в БД и там есть коллекция документов. Контекст для добавления аутентификации позже. За последние 2 дня я безуспешно пробовал несколько вариантов именования коллекции. Нужно ли объявлять const? Что мне не хватает?

Сервер. js

const express = require('express');
const graphqlHTTP = require('express-graphql');
const schema = require('./graphql/schema')
const mongoose1 = require('./mongoDB')
const expressPlayground = require('graphql-playground-middleware-express').default;
const cors = require('cors')

const Event = require('./models/events')

const app = express();

app.use(cors())

app.use(express.json());

// DB
const context = async () => {
    const db = await mongoose1;

    return { db };
};


// Provide resolver functions for your schema fields
const resolvers = {
    events: async (_, context) => {
        const { db } = await context();
        return db
            .collection('events')
            .find()
            .toArray();
    },
    event: async ({ _id }, context) => {
        const { db } = await context();
        return db.collection('events').findOne({ _id });
    },
    createEvent: args => {
        const event = new Event({
            title: args.eventInput.title,
            description: args.eventInput.description,
        })
        return event.save().then(res => {
            console.log(res);
            return { ...res._doc }
        }).catch(err => {
            console.log(err)
            throw err
        });
    }
}

app.use(
    "/graphql",
    graphqlHTTP({
        schema,
        rootValue: resolvers,
        context,
    })
);
app.get('/playground', expressPlayground({ endpoint: '/graphql' }))
app.listen(5000);

console.log(`? Server ready at http://localhost:5000/graphql`); 

БД

require('dotenv').config()
const mongoose = require('mongoose');

const db = process.env.MONGODB

const mongoose1 = mongoose
    .connect(db, {
        useNewUrlParser: true,
        useCreateIndex: true,
        useUnifiedTopology: true
    }) 
    .then(() => console.log('MongoDB Connected...'))
    .catch(err => console.log(err));


module.exports = mongoose1

Схема

const { buildSchema } = require('graphql');


// Construct Schema
const schema = buildSchema(`
    type Event {
        _id: ID!
        title: String!
        description: String
        date: String

    }

    input EventInput {
        title: String!
        description: String
        date: String

    }

    type Query {
        events: [Event!]!
        event(_id: String!): Event!
    }

    type Mutation {
        createEvent(eventInput: EventInput): Event
    }
`);

module.exports = schema

Модель

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const eventSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    date: {
        type: Date,
        default: Date.now
    }
})

module.exports = mongoose.model('Event', eventSchema)

1 Ответ

1 голос
/ 18 января 2020

Функция, которую экспортирует mongoDB.js, возвращает Обещание, но это Обещание преобразуется в undefined, поскольку console.log возвращает неопределенное значение. Поскольку connect должно соответствовать значению экземпляра Mongoose, который его вызвал, либо полностью удалите вызов then, либо убедитесь, что вы возвращаете экземпляр Mongoose внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...