首页 > 解决方案 > 传递参数子类型 graphql

问题描述

我想知道如何以“子”类型传递参数。有了这个请求,我想只收到来自用户 id 1 的 id 1 的消息。

目前我有这个要求:

{user(id:1){
  email,
  username,
  messages(id:1){
    text,
    id
  }
}}

我在架构中修改了用户类型,并更改了

messages: [Message]

经过

messages(id: Int): [Message]

但我总是收到来自用户的所有消息,而不是具有特定 ID 的消息。

schema.js

import { gql } from 'apollo-server';

export const typeDefs = gql`

  # declare custom scalars
  scalar Date

  ##########
  ## TYPE ##
  ##########

  # a group
    type Group {
      id: Int!
      name: String
      users: [User]!
      messages: [Message]
    }

  # a user
  type User {
    id: Int! # unique id for the user
    email: String!
    username: String
    messages(id: Int): [Message]
    groups: [Group]
    friends: [User]
  }

  # a message sent from a user to a group
  type Message {
    id: Int!
    to: Group!
    from: User!
    text: String!
    createdAt: Date!
  }

  ###########
  ## QUERY ##
  ###########

  # query for types
  type Query {
    user(email: String, id: Int): User

    messages(groupId: Int, userId: Int): [Message]
  }

  schema {
    query: Query
  }
`;

export default typeDefs;

解析器.js

import GraphQLDate from 'graphql-date';
import { Group, Message, User } from './connectors';

export const resolvers = {
    Date: GraphQLDate,
    Query: {
        group(_, args) {
            return Group.find({ where: args });
        },
        messages(_, args) {
            return Message.findAll({
                where: args,
                order: [['createdAt', 'DESC']],
            });
        },
        user(_, args) {
            return User.findOne({ where: args });
        },
    },
    Group: {
        users(group) {
            return group.getUsers();
        },
        messages(group) {
            return Message.findAll({
                where: { groupId: group.id },
                order: [['createdAt', 'DESC']],
            });
        },
    },
    Message: {
        to(message) {
            return message.getGroup();
        },
        from(message) {
            return message.getUser();
        },
    },
    User: {
        messages(user) {
            return Message.findAll({
                where: { userId: user.id },
                order: [['createdAt', 'DESC']],
            });
        },
        groups(user) {
            return user.getGroups();
        },
        friends(user) {
            return user.getFriends();
        },
    },
};

export default resolvers;

标签: graphqlapolloapollo-server

解决方案


您必须更新User.messages解析器。这边走:

User: {
        messages(user, { id }) {
            return Message.findAll({
                where: { userId: user.id, id },
                order: [['createdAt', 'DESC']],
            });
        },
        groups(user) {
            return user.getGroups();
        },
        friends(user) {
            return user.getFriends();
        },
    },

如果你想让id参数可选,这样的事情可能会有所帮助:

    messages(user, { id }) {
        const where = { userId: user.id }
        if (id) {
          where.id = id
        }

        return Message.findAll({
            where,
            order: [['createdAt', 'DESC']],
        });
    },

推荐阅读