繁体   English   中英

如何使用type-graphql获取graphQL类型的映射类型名称

[英]How can I get mapped type names for a graphQL type using type-graphql

好的,所以我开始深入研究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查询中排除属性字段,即使sequelize返回departmentId作为属性名称,当我从解析器返回它并且它到达客户端时,属性名称是id。

任何帮助将不胜感激....我试图通过仅获取所请求的属性而不是整个对象来优化所有内容。 我总是可以将地图存储为单独的常量并在我的@Field定义中使用它们,但是我想这样做是最后的手段,但是如果我可以尽量保持代码尽可能精简....

谢谢大家。

不幸的是, name选项主要是为了支持解析器继承而引入的。 使用它来映射架构字段名称是一种未记录的功能,因此它不提供任何映射或公开映射元数据。

对输入或args类型使用name选项会更糟糕 - 它将导致无法访问字段并且属性未定义。

现在我的建议是保持简单,不要映射字段名称,直到适当的修复程序到达。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM