GraphQL Playground中关联FaunaDB Lambda的FQL传参与批量更新问题
FaunaDB GraphQL 自定义Resolver开发实现指南
核心运行规则
- 参数注入逻辑:绑定
@resolver的FaunaDB用户定义函数(UDF),会严格按照GraphQL Mutation定义的入参顺序,将请求传入的参数直接作为Lambda形参注入。原有基础实现Query(Lambda(["input"], []))无法看到传入参数,本质是未将接收到的input变量作为返回值输出,并非参数无法获取——只要将返回值替换为input,即可直接拿到完整入参内容。 - 类型校验报错根因:使用
Query(Lambda(["input"], Get(Ref(...))))实现时报错,核心原因是外层包裹的Query()是FaunaDB用于创建Set(可分页数据集)的FQL函数,其返回值会被GraphQL引擎识别为数组类型。当Mutation声明的返回值为单个对象(如当前Schema定义的Form!)时,引擎检测到UDF返回Set类型而非单个文档,就会触发类型不匹配的报错。 - 数组入参支持能力:FaunaDB原生支持对象数组形式的批量入参,前提是在GraphQL Schema层面将入参类型定义为列表结构,而非单个input对象。
- 注意:非分页类的Mutation/Query自定义Resolver,不需要在UDF外层嵌套
Query()函数,否则会触发类型识别错误,只有返回分页列表的场景才需要使用Query()构造Set类型返回值。
Schema调整要点
当前Schema定义存在两处影响功能的问题,需完成修正:
- 批量入参结构调整:如果要接收数组形式的批量更新参数,需要将Mutation的入参从单个
FormInputValInput改为列表类型,同时给FormInputValInput新增文档ID字段,用于关联目标更新文档:input FormInputValInput { id: ID! name: String! index: Int! type: String! } type Mutation { updateMultipleInputVals(input: [FormInputValInput!]!): Form! @resolver(name: "multiple_inputs") } - 返回值匹配要求:UDF的返回值必须和Mutation声明的返回类型严格一致,不能出现返回Set、数组、单个对象与声明类型错位的情况。
按ID批量更新的FQL实现方式
完成Schema修正后,调整UDF实现逻辑,去掉外层不必要的Query()包裹,直接在Lambda中遍历入参数组完成文档更新即可:
// UDF主体为Lambda逻辑,无需外层嵌套Query() Lambda(["input"], // 遍历入参数组,对每个ID对应的文档执行更新操作 Map( input, Lambda(["updateItem"], Update( Ref(Collection("FormInputVal"), updateItem.id), { data: { name: updateItem.name, index: updateItem.index, type: updateItem.type } } ) ) ), // 按照Schema要求返回关联的Form文档对象 Get(Ref(Collection("Form"), "对应Form文档的ID")) )
实现说明
- 代码通过
Map()函数遍历整个传入的数组入参,逐个定位对应ID的文档执行更新,可直接实现按ID批量更新的需求。 - 如需将更新后的所有
FormInputVal结果返回,只需将Mutation的返回类型调整为[FormInputVal!]!,将Map()的遍历结果直接作为UDF返回值即可,无需额外修改核心逻辑。
内容的提问来源于stack exchange,提问作者Anders Kitson
相关产品推荐
相关产品推荐

