Sequelize+MySQL执行GraphQL删除操作返回被删ID为null问题咨询
问题原因
- 你使用的ORM(从代码逻辑判断为Sequelize)的
destroy方法默认返回值为被删除的记录行数,而非被删除的记录对象,你直接将行数赋值给propertyItem,返回值不符合PropertyItem类型定义,因此所有字段返回null。 - Schema定义与业务逻辑不匹配:Mutation入参
id为[ID!]!数组类型,支持批量删除,但返回结构中propertyItem是单个PropertyItem对象,即便拿到删除记录,结构也不匹配。
解决步骤
步骤1:调整删除操作配置,获取被删除的记录
给destroy方法添加两个参数:
returning: true:配置删除后返回被删除的记录individualHooks: true:开启单条记录钩子,确保多条删除时可以返回所有被删记录
步骤2:调整Schema适配批量删除场景
因为入参支持传多个ID批量删除,将返回结构中的单个对象修改为数组,避免结构不匹配报错:
type DeletePropertyItemsRes { success: Boolean! message: String! propertyItems: [PropertyItem] # 修改为数组类型 }
步骤3:修改Resolver返回逻辑
修改后的Resolver代码如下:
async deletePropertyItems(_, { id }, { models }) { try { const deletedItems = await models.PropertyItem.destroy({ where: { id: id }, returning: true, individualHooks: true }); if (deletedItems.length > 0) { return { success: true, message: "Property Item(s) Deleted Successfully!", propertyItems: deletedItems, }; } return { success: false, message: "未找到匹配的可删除条目", }; } catch (error) { throw new Error(error.message); } },
补充说明
如果你不需要批量删除功能,也可以将Mutation入参修改为单个IDid: ID!,无需修改返回结构,只需要调整删除操作的配置拿到单条被删记录即可。
如果你使用的是其他ORM(如Prisma),只需要对应调整删除方法的配置,让接口返回被删除的记录对象即可。
内容的提问来源于stack exchange,提问作者Alexdev
相关产品推荐
相关产品推荐

