#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. Спасибо, это сработало, это именно то, что мне было нужно.