Итак, я начинаю немного копаться в graphql, и я создал API, используя koa, type-graphql и sequenceize-typescript. Все работает очень хорошо... Мне удалось заставить запрос работать, и даже удалось немного оптимизировать, используя поля graphql для фильтрации столбцов, которые я запрашиваю в базе данных... Однако, когда я использовал псевдоним для имени поля , я не могу получить сопоставленное имя.....
Например, учитывая следующую модель ObjectType/Sequelize....
export interface IDepartment {
departmentId: number;
name: string;
description: string;
}
@ObjectType()
@Table({ underscored: true })
export class Department extends Model<Department> implements IDepartment {
@Field({ name: 'id' })
@PrimaryKey
@Column({ field: 'department_id'})
public departmentId: number;
@Field()
@Length({ max: 100 })
@Column
name: string;
@Field()
@Length({ max: 100 })
@AllowNull
@Column
description: string;
}
и образец запроса....
query {
department(name: "Test Dept") {
id
name,
description
}
}
пробный резольвер...
async department(@Arg('name') name: string, @Info() info: GraphQLResolveInfo) {
return Department.findOne({
where: { name }
});
}
Это работает просто отлично .... но когда я делаю
async department(@Arg('name') name: string, @Info() info: GraphQLResolveInfo) {
let fields = Object.keys(getFields(info))
return Department.findOne({
attributes: fields,
where: { name }
});
}
(getFields — это graphql-fields), это не удается, потому что в запросе указан идентификатор имени поля, который возвращает graphql-fields, но имя столбца — Department_id (упорядочить имя модели DepartmentId).
Я внимательно изучил схему, используя функцию introspectionFromSchema, чтобы увидеть подробную копию моей схемы, но нигде нет упоминания об ИД_отдела или ИД_отдела.... Однако я знаю, что он где-то там, потому что, когда я исключить поле атрибутов из моего запроса на сиквелизацию, хотя сиквелизация возвращает в качестве имени свойства DepartmentId, когда я возвращаю его из своего преобразователя и он достигает клиента, имя свойства — id.
Буду признателен за любую помощь... Я пытаюсь оптимизировать все, выбирая только запрошенные свойства, а не весь объект. Я всегда мог бы хранить карты как отдельные константы и использовать их в своем определении @Field, но я хочу сделать это в крайнем случае, однако, если я могу, я стараюсь, чтобы код был как можно более компактным....
Спасибо всем заранее.





К сожалению, опция name была введена в основном для поддержки наследования распознавателей. Использование этого для сопоставления имен полей схемы является своего рода недокументированной функцией, поэтому оно не обеспечивает никакого сопоставления или раскрытия метаданных сопоставления.
Использование опции name для типов ввода или аргументов будет еще хуже — это приведет к отсутствию доступа к полям и неопределенным свойствам.
На данный момент я рекомендую просто сохранять простоту и не сопоставлять имена полей, пока не появится надлежащее исправление.