GraphQL更新Mutation的Input Schema如何支持仅传递部分更新字段?
问题根因
你遇到的GraphQL error: Illegal arguments: undefined, string报错和Schema定义无关,是服务端更新逻辑的问题:无论用户是否传入password字段,你都强制调用hashSync(payload.password, HASH_ROUNDS),如果用户没传密码,payload.password为undefined,传入哈希方法就会触发该报错。
你误以为必须传全量字段才能请求成功,本质也是这个报错导致的:只要你没传password字段就会报错,和其他字段是否传递没有关系。
修复方案
1. 优先修复服务端更新逻辑
仅当用户传入password字段时才做哈希处理,未传入的字段不要主动添加到更新参数中,避免覆盖数据库原有值:
const updateData = { ...payload } // 仅传了密码时才做哈希 if (updateData.password) { updateData.password = hashSync(updateData.password, HASH_ROUNDS) } return { type: 'UserSuccess', code: 200, success: true, user: await this.update(id, updateData), message: `User updated successfully` }
2. Schema 优化说明
你当前定义的UpdateUserInput中所有字段都没有加非空标记!,本身就天然支持传递任意部分字段,不需要修改Input结构。
唯一可调整的点是前端Mutation的参数定义:你当前前端写的是$payload: UpdateUserInput!,尾部的!表示payload本身不能为null,如果你允许用户不传任何更新参数(场景极少),可以去掉这个!和后端定义对齐,否则保留也不影响部分字段更新的能力。
调整完成后,你可以直接传递任意需要更新的字段,未传递的字段不会被修改,完全符合业务需求。
内容的提问来源于stack exchange,提问作者user16373392
相关产品推荐
相关产品推荐

