根据其他未请求的字段返回自定义字段?



假设我想使用这个查询获得一个人的age:

{
getUser(id: "09d14db4-be1a-49d4-a0bd-6b46cc1ceabb") {
full_name
age
}
}

我像这样解决我的getUser查询(我使用node.js,type-graphqlknex):

async getUser(getUserArgs: GetUserArgs, fields: UserFields[]): Promise<User> {
// Return ONLY ASKED FIELDS
const response = await knex.select(this.getKnexFields(fields)).from(USER).whereRaw('id = ?', [getUserArgs.id]);
// returns { full_name: 'John Smith' }
return response[0];
}

问题是,然后我不能计算age字段,因为我没有得到born_at(datetime字段存储在数据库中)在第一个地方:

@FieldResolver()
age(@Root() user: User, @Info() info: GraphQLResolveInfo): number {
console.log(user); // { full_name: 'John Smith' }  no born_at field - no age, so error
// calculate age from born_at
return DateTime.fromJSDate(user.born_at).diff(DateTime.fromJSDate(new Date()), ['years']).years;
}

是否有一些花哨的graphql内置方法/约定来预测born_at将需要,而不是通过info/context手动执行

?

您应该始终从查询级解析器返回完整的实体数据,以便它们可用于字段解析器。

另一种解决方案是手动维护字段解析器所需字段的列表,这样您的"字段"就可以直接调用了。

进一步的改进可能是根据请求的字段(因此将触发字段解析器)创建一个额外列的列表。