好的,所以我开始深入研究graphql,并且我已经使用koa,type-graphql和sequelize-typescript构建了一个api。一切正常。...我设法使查询正常工作,甚至设法通过使用graphql-fields过滤了我在数据库中查询的列来进行了一些优化...但是,当我为字段名加上别名时,我似乎无法获取映射的名称.....
例如,给定以下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),它失败,因为查询指定了字段名称id(即graphql-fields返回的内容),但列名是department_id(将模型名称为departmentId的别名)。
我已经用细齿梳仔细浏览了该模式,使用了introspectionFromSchema函数来查看我的模式的详细副本,但是在任何地方都没有提到departmentId或department_id。...但是我知道它在某个地方因为当我从sequelize查询中排除attribute字段时,即使sequelize将departmentId作为属性名称,当我从解析器中返回它并到达客户端时,该属性名称都是id。
任何帮助将不胜感激。...我试图通过仅获取请求的属性而不是整个对象来优化所有内容。我总是可以将地图存储为单独的常量,并在我的@Field定义中使用它们,但是我想作为最后的选择,但是如果可以的话,我将尝试保持代码尽可能的精简。 / p>
谢谢大家。
答案 0 :(得分:0)
不幸的是,引入name
选项主要是为了支持解析程序继承。使用它来映射架构字段名称是一种未记录的功能,因此它不提供任何映射或公开映射元数据。
将name
选项用于输入或args类型将更加糟糕-这将导致无法访问字段且属性未定义。
目前,我的建议是保持简单,不要映射字段名称,直到适当的修复程序到达为止。