【问题标题】:Query wont return data from relationship查询不会从关系中返回数据
【发布时间】:2020-02-16 03:13:06
【问题描述】:

我正在关注this 视频系列。

我在获取有关在以下脚本中创建 eventuser 的数据时遇到问题

这是我的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.jsevent.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 完全陌生,任何答案都将不胜感激。

【问题讨论】:

    标签: mongodb express mongoose graphql


    【解决方案1】:

    也许这可能对其他人有帮助,我不知道那里会发生什么,但我得到了预期的结果,通过添加

    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;
                    })
            },
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 2021-03-03
      相关资源
      最近更新 更多