2017-11-11 254 views
0

第二周,我尝试链接apollo-server-express/MongoDB/Mongoose/GraphQL堆栈中的两个集合,但我不明白。我发现了一个与REST API相似的课程,我需要的是所谓的关系。我需要这个,但在GraphQL关系GraphQL

watch video

如何车添加到用户? 我收集的测试服务器,该代码是在这里:https://github.com/gHashTag/test-graphql-server 帮助

回答

0

我克隆了你的项目,并实现了一些代码,这里我改变了关系的作品。请注意,我只是做了一个基本的代码,没有验证或提前dataloader只是为了确保非复杂性。希望它可以帮助。

的src/graphql /解析器/轿厢resolvers.js

import Car from '../../models/Car' 
import User from '../../models/User' 

export default { 
    getCar: (_, { _id }) => Car.findById(_id), 
    getCars:() => Car.find({}), 
    getCarsByUser: (user, {}) => Car.find({seller: user._id }), // for relationship 
    createCar: async (_, args) => { 
    // Create new car 
    return await Car.create(args) 
    } 
} 

的src/graphql /分解器/用户resolvers.js

import User from '../../models/User' 

export default { 
    getUser: (_, { _id }) => User.findById(_id), 
    getUsers:() => User.find({}), 
    getUserByCar: (car, args) => User.findById(car.seller), // for relationship 
    createUser: (_, args) => { 
    return User.create(args) 
    } 
} 

的src/graphql /解析器/index.js

import UserResolvers from './user-resolvers' 
import CarResolvers from './car-resolvers' 

export default { 
    User:{ 
    cars: CarResolvers.getCarsByUser // tricky part to link query relation ship between User and Car 
    }, 
    Car:{ 
    seller: UserResolvers.getUserByCar // tricky part to link query relation ship between User and Car 
    }, 
    Query: { 
    getUser: UserResolvers.getUser, 
    getUsers: UserResolvers.getUsers, 
    getCar: CarResolvers.getCar, 
    getCars: CarResolvers.getCars 
    }, 

    Mutation: { 
    createUser: UserResolvers.createUser, 
    createCar: CarResolvers.createCar, 
    } 
} 

的src/graphql/schema.js

export default` 
    type Status { 
    message: String! 
    } 

    type User { 
    _id: ID! 
    firstName: String 
    lastName: String 
    email: String 
    cars: [Car] 
    } 

    type Car { 
    _id: ID 
    make: String 
    model: String 
    year: String 
    seller: User 
    } 

    type Query { 
    getUser(_id: ID!): User 
    getUsers: [User] 
    getCar(_id: ID!): Car 
    getCars: [Car] 
    } 

    type Mutation { 
    createUser(firstName: String, lastName: String, email: String): User 
    // change from _id to seller, due to base on logic _id conflict with CarId 
    createCar(seller: ID!, make: String, model: String, year: String): Car 
    } 

    schema { 
    query: Query 
    mutation: Mutation 
    } 
` 

的src/middlewares.js

import bodyParser from 'body-parser' 
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express' 
import { makeExecutableSchema } from 'graphql-tools' 

import typeDefs from '../graphql/schema' 
import resolvers from '../graphql/resolvers' 
import constants from './constants' 

export const schema = makeExecutableSchema({ 
    typeDefs, 
    resolvers 
}) 

export default app => { 

    app.use('/graphiql', graphiqlExpress({ 
    endpointURL: constants.GRAPHQL_PATH 
    })) 

    app.use(
    constants.GRAPHQL_PATH, 
    bodyParser.json(), 
    graphqlExpress(req => ({ 
     schema, 
     context: { 
     event: req.event 
     } 
    })) 
) 
} 

enter image description here

enter image description here

enter image description here

enter image description here

+0

非常感谢您,表了解一对多通信,但如何使连接多对多? –

0

尝试做这样的事情在你的车解析器

export default { 
    getCar: ({ _id: ownId }, { _id }) => 
    Car.findById(ownId || _id); 
// here is the rest of your code 
0

您需要在用户类型添加一个解析器为cars场。

const resolvers = { 
    Query: { 
    getUsers: ... 
    getCars: ... 
    ... 
    }, 
    Mutation: { 
    ... 
    }, 
    User: { 
    cars: ... 
    } 
}