GraphQL resolver实现返回记录计数功能问题求助
核心错误点
你的实现无法运行是三个明确问题导致的:
- Schema定义错误:
getFormsAndCount的返回类型写为[AllForms],代表返回AllForms结构的数组,但你实际需要返回单个包含列表和计数的对象,数组包裹是多余的。 - 缺少查询入口resolver:你只定义了AllForms类型下count字段的计算逻辑,没有给
getFormsAndCount这个Query字段写对应的实现,请求时根本拿不到初始数据。 - 预期返回结构不符合JSON/GraphQL规范:你想把count字段直接和数组元素平铺在同一层级,这种结构语法上不成立,GraphQL的强类型系统也不支持这种返回格式,必须用父对象包裹列表和计数字段。
修正方案
1. 修正Schema定义(typeDefs.js)
去掉getFormsAndCount返回类型的数组括号,修正后代码:
type UnitSignInForm { id: ID! givenName: String! department: String! unit: String! isSignedIn: Boolean! signedInAt: String signedOutAt: String } type AllForms { forms: [UnitSignInForm] count: Int! } type Query { getAllSignInForms(bySignedIn: Boolean, byUnit: String): [UnitSignInForm] getFormsAndCount(bySignedIn: Boolean, byUnit: String): AllForms }
2. 实现resolver逻辑
两种实现方式二选一即可,优先选第一种,性能更好。
方式1:查询时直接返回完整结构(推荐)
直接复用你现有getAllSignInForms的过滤查询逻辑,在formsResolver.js中添加getFormsAndCount的实现,不需要额外写AllForms的类型resolver:
// 把你原来写在getAllSignInForms里的查询逻辑抽成公共函数,避免重复代码 async function findFormList(args) { // 这里放你原来根据bySignedIn、byUnit参数过滤查询表单的逻辑 // 比如数据库查询、内存过滤都可以,和getAllSignInForms的逻辑完全一致 } const Query = { getAllSignInForms: async (_, args) => { return await findFormList(args) }, getFormsAndCount: async (_, args) => { const forms = await findFormList(args) return { forms, count: forms.length } } } export default { Query }
resolvers/index.js不需要额外加AllForms的resolver,保持正常合并即可:
export default { Query: { ...formsResolver.Query, }, }
方式2:保留类型resolver自动计算count
如果你希望count字段的逻辑和查询逻辑解耦,可以保留你之前写的AllForms类型resolver,此时getFormsAndCount只需要返回forms列表:
// formsResolver.js的Query部分 getFormsAndCount: async (_, args) => { const forms = await findFormList(args) return { forms } }
resolvers/index.js保留你之前写的count计算逻辑:
export default { AllForms: { count: (parent) => parent.forms.length, }, Query: { ...formsResolver.Query, }, }
3. 调用方式
查询时需要明确指定你要取的字段,示例请求:
query FormList($bySignedIn: Boolean, $byUnit: String) { getFormsAndCount(bySignedIn: $bySignedIn, byUnit: $byUnit) { count forms { id givenName department unit isSignedIn signedInAt } } }
返回结果结构:
{ "data": { "getFormsAndCount": { "count": 2, "forms": [ { "id": "cl4bp1apf0004lkuxhhhxjlyt", "givenName": "persons name", "department": "MAINT", "unit": "some unit", "isSignedIn": true, "signedInAt": "06/12/2022 12:22 PM" }, { "id": "fggfgfgv04lkuxhhhxjlyt", "givenName": "other persons name", "department": "MAINT", "unit": "some unit", "isSignedIn": true, "signedInAt": "06/12/2022 12:22 PM" } ] } } }
补充说明:如果后续需要做分页,这种把列表和总数放在同一个父对象下的结构也是标准做法,可以直接扩展page、pageSize等字段,不需要调整整体结构。
内容的提问来源于stack exchange,提问作者graylagx2
相关产品推荐
相关产品推荐

