Директивы для скаляров на сервере Apollo GraphQL

#node.js #graphql #apollo-server

#node.js #graphql #apollo-сервер

Вопрос:

У меня есть дата, определенная как скаляр в моей схеме.

Есть ли способ определить правила, касающиеся юридических значений, только в одном месте?

Вероятно, я мог бы определить директиву для FIELD_DEFINITION и применить ее к каждому полю этого типа. Тем не менее, я хотел бы сделать это один раз. Возможно ли это?

Вот мой код. Код гражданства на самом деле является строкой, ограниченной значениями «us», «uk», «de» и т.д. Я хотел бы реализовать проверку централизованным способом, а не добавлять директиву к каждому полю этого типа:

 scalar CitizenshipCode    # is it possible to implement the validation here?


type Client {
  id: ID!
  name: String
  citizenship: CitizenshipCode   #  instead of here...
  # other atts
}

type User {
  id: ID!
  email: String
  citizenship: CitizenshipCode   #  ... and here
  # other atts
}
  

Комментарии:

1. Не могли бы вы добавить фрагмент кода, в котором вы определяете скаляр? А также, что вы подразумеваете под «правилами, касающимися значений», речь идет о проверке?

2. Спасибо @Anastasiia! Я обновил свой текст описания, чтобы ответить на этот вопрос.

Ответ №1:

Возможно, вы можете использовать тип enum или использовать пользовательскую схему в своем коде:

 const { ApolloServer, gql, SchemaDirectiveVisitor } = require('apollo-server');
const { GraphQLScalarType, Kind } = require('graphql');

const validCountryCodes = [ "US", "UK", "DE"];

const citizenshipCodeScalar = new GraphQLScalarType({
    name: 'CitizenshipCode',
    description: 'Allowed citizen ship codes',
    serialize(value) {
        return validCountryCodes.includes(value) ? value : "INVALID COUNTRY";
    },
    parseValue(value) {
        return validCountryCodes.includes(value) ? value : null;
    },
    parseLiteral(ast) {
        return ast.kind === Kind.STRING ? ast.value : null;
    }
});

const typeDefs = gql `
  scalar CitizenshipCode

  type Client {
    id: ID
    name: String
    citizenship: CitizenshipCode
  }

  type User {
    id: Int
    email: String
    citizenship: CitizenshipCode
  }

  type Query {
      clients: [Client]
      users: [User]
  }
`;

const resolvers = {
    Query: {
        clients: () => clients,
        users: () => users
    },
    CitizenshipCode: citizenshipCodeScalar
};

const client = [{
        id: 'client1',
        name: 'The Awakening',
        citizenship: 'US'
    },
    {
        id: 'client2',
        title: 'City of Glass',
        citizenship: 'CA',
    },
];

const users = [{
        id: 1,
        email: 'test1@test.com',
        citizenship: 'UK',
    },
    {
        id: 2,
        email: 'test2@test.com',
        citizenship: 'DE',
    },
];

const server = new ApolloServer({
    typeDefs,
    resolvers
});
  

Комментарии:

1. @Aleks у тебя была возможность взглянуть?

2. @Aleks странно! кажется, работает для меня. Это мой код приложения node, взгляните: pastebin.com/ScZMAuRS

3. Спасибо, это сработало, это именно то, что мне было нужно.