我在使用Sequelize和Typescript开发GraphQL Api服务器时有些卡住。 我的问题与打字和概念问题有关。我已经根据数据库表及其关系定义了Sequelize模型。 我在GraphQL解析器中使用这些模型,例如:
Query: {
part: (_, { id }, { models }) => models.Part.findByPk(id),
parts: (_, __, { models }) => models.Part.findAll(),
},
Part: {
subparts: async (parent, _, { models }) => {
const parentPart = await models.Part.findByPk(parent.id, { include: { model: models.Part, as: 'children' } });
if (parentPart) {
return parentPart.getChildren();
}
return [];
}
我的疑问与字段subparts
解析器的第一个参数的类型有关。根据我通过graphQL code generator parent
生成的解析器类型,应该具有我在模式中定义的相同类型,但这不是正确的,它具有模型类型,因为模型实例是父解析器返回。
更新:我在此附上我的codegen.yml
,并发表了非常有价值的评论。
我为Part
类型定义了一个映射器,这就是我应该为parent
解析器参数的类型。
schema: ./src/**/*.typedefs.ts
generates:
./src/types/graphql.generated.ts:
plugins:
- typescript
- typescript-resolvers
config:
noSchemaStitching: true
useIndexSignature: true
contextType: ../context#MyContext
mappers:
Part: ../part/part.types#IPart
MacroProduct: ../macro-product/macroProduct.types#IMacroProduct
这是我用作Part
映射器的类型:
export interface IPart {
id: number;
name: string;
thumb?: string;
subparts?: [IPart];
parentId?: number;
}
我以为它应该是parent
arg的类型,但是我在查询解析器中使用了Sequelize提供的find
方法,所以也许这也会影响parent
类型
我理解和/或做错了什么?
非常感谢所有愿意花时间帮助我的人。