Я хотел бы сделать каждое поле закрытым, если иное не указано в директиве. Можно ли получить эту информацию в функции разрешения?
const typeDefs = gql`
directive @public on FIELD_DEFINITION
type Query {
viewer: User @public
secret: String
}
type User {
id: ID!
}
`
const schema = makeExecutableSchema({
typeDefs,
resolvers,
});
addSchemaLevelResolveFunction(schema, (parent, args, params, info) => {
// Not possible
if (info.fieldName.directive === 'public') {
return parent;
}
throw new Error('Authentication required...');
});
const server = new ApolloServer({ schema });



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хотя есть свойство directives для объекта FieldNode в массиве fieldNodes, насколько мне известно, оно не заполнено директивами, которые применяются к этому конкретному полю.
Директивы на самом деле не предназначены для использования в качестве флага для чего-то, на что можно ссылаться в преобразователе (уровень схемы или иначе). Вы можете подумать о переносе своей логики внутри функции директивы visitFieldDefinition:
const { defaultFieldResolver } = require('graphql')
const { SchemaDirectiveVisitor } = require('graphql-tools')
class PublicDirective extends SchemaDirectiveVisitor {
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field
field.resolve = async function (source, args, context, info) {
if (someCondition) {
throw new SomeError()
}
return resolve.apply(this, [source, args, context, info])
}
}
}
const schema = makeExecutableSchema({
typeDefs,
resolvers,
schemaResolvers: {
public: PublicDirective,
},
})
Есть ли простой способ автоматически добавлять директивы во все поля (например, @private) во время компиляции?
Ах, извините, не совсем понял, что вы пытались сделать. Вы можете заставить директиву ввести какое-то произвольное свойство в контекст, а затем проверить наличие этого свойства внутри addSchemaLevelResolveFunction.
Да, это работает для чего-то вроде директивы
@private(по умолчанию общедоступной), но я надеялся найти способ обратного.