Запрос не вернет данные из отношений - PullRequest
0 голосов
/ 19 октября 2019

Я слежу за этой видео серией.

Здесь у меня проблема с получением данных о user, который создал event в следующем сценарии

вотмои app.js

const express = require('express');
const bodyParser = require('body-parser');
const graphqlHttp = require('express-graphql')
const { buildSchema } = require('graphql');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const Event = require('./models/event');
const User = require('./models/user');

const app = express();

const conString = `mongodb+srv://${process.env.MONGO_USER}:${process.env.MONGO_PASSWORD}@clusterpl-qiufl.mongodb.net/${process.env.MONGO_DB}?retryWrites=true&w=majority`

app.use(bodyParser.json());

app.use(
    '/graphql',
    graphqlHttp({
        schema: buildSchema(`

            type Event {
                _id: ID!
                title: String!
                description: String!
                price: Float!
                date: String!
                creator: User!

            }

            type User {
                _id: ID!
                email: String!
                password: String!
                createdEvents: [Event!]

            }

            input UserInput {
                email: String!
                password: String!
            }

            input EventInput {
                title: String!
                description: String!
                price: Float!
                date: String!
            }

            type RootQuery {
                events: [Event!]!

            }

            type RootMutation {
                createEvent(eventInput: EventInput): Event
                createUser(userInput: UserInput): User
            }

            schema {
                query: RootQuery,
                mutation: RootMutation
            }
        `) ,

        rootValue: {

            events: () => {
                return Event.find().populate('creator')
                .then(events => {
                    console.log(events)
                    return events.map(event => {
                        console.log(event)
                        return { 
                            ...event._doc,
                            _id: event.id
                        };
                    });
                })
                .catch(err => {
                    throw err;
                })
            },

            ..

        },
        graphiql: true
    })
);

mongoose.connect(conString, {useNewUrlParser: true}).then(
    () => {console.log('Success !')},
    err => { console.log(err) }

)


    app.listen(3000);

user.js и event.js

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const userSchema = new Schema({
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },

    createdEvents: [
        {
            type: Schema.Types.ObjectId,
            ref: 'Event'
        }
    ]
});

module.exports = mongoose.model('User', userSchema)


const mongoose = require('mongoose');

const Schema = mongoose.Schema

const eventSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    description: {
        type: String,
        required: true
    },
    price: {
        type: Number,
        required: true
    },
    date: {
        type: Date,
        required: true
    },

    creator: [
        {
            type: Schema.Types.ObjectId,
            ref: 'User'
        }
    ]
});

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

после того, как я отправляю этот запрос graphql

query{
  events {
    creator {
      email
    }
  }
}

возвращает "message": "Cannot return null for non-nullable field User.email.",

Я совершенно новичок в graphql, и любой ответ был бы очень признателен.

1 Ответ

0 голосов
/ 22 октября 2019

возможно, это может помочь кому-то еще, я не знаю, что там происходит, но я получил ожидаемые результаты, добавив метод

const user =  userId => {
    return User.findById(userId).then(user => {
        return { ...user._doc, _id: user.id };
    })
    .catch(err => {
        throw err;
    });
}

и использовал его в функции распознавания событий, подобной этой

events: () => {


return Event.find()
                .populate('creator')
                .then(events => {
                    return events.map(event => {
                        console.log('ev',event._doc)
                        return { 
                            ...event._doc,
                            _id: event.id,
                            // creator: {
                            //     ...event._doc.creator._doc,
                            //     _id: event._doc.creator.id
                            // }
                            creator: user.bind(this, event._doc.creator)
                        };
                    })
                })
                .catch(err => {
                    throw err;
                })
        },

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