GraphQL-Express应用非空字段返回null:删除预订功能报错
问题分析与解决方案
核心问题
报错Cannot return null for non-nullable field Booking.booking_id本质是你的Resolver返回的数据不符合GraphQL定义的Booking类型约束,具体有两个触发场景:
- 传入无效ID时返回了错误格式的数据:当
args.id为空时,你返回了JSON字符串,但GraphQL期望返回Booking对象或null,字符串无法解析出booking_id等非空字段,直接触发报错。 - 删除不存在的预订时返回了null:
findByIdAndDelete找不到匹配文档时会返回null,此时请求booking_id字段,GraphQL因无法从null中获取非空字段而报错。
修复步骤
1. 修正Resolver的错误处理逻辑
不要返回JSON字符串,而是抛出标准GraphQL错误,同时处理找不到预订的情况:
deleteBooking: async (parent, args) => { if (!args.id) { throw new Error("No ID provided"); } const deletedBooking = await Booking.findByIdAndDelete(args.id); if (!deletedBooking) { throw new Error("Booking not found with the provided ID"); } return deletedBooking; },
2. 确认数据库文档与GraphQL类型匹配
检查MongoDB中Booking集合的文档,确保每个文档都包含booking_id、listing_id等所有带!标记的非空字段——如果数据库里有字段缺失,即使删除成功,返回的文档也会触发非空约束报错。
3. 统一测试Mutation的变量类型
你的deleteBooking接收的参数是ID!,测试时变量类型建议同步为ID,保持类型一致可避免潜在转换问题:
mutation delete($id: ID!){ deleteBooking(id: $id){ booking_id } }
额外验证
可以在Resolver中打印deletedBooking,确认返回的被删除文档是否包含所有必填字段,这能快速定位是否是数据库数据结构的问题。
内容的提问来源于stack exchange,提问作者Ronan Duffy
相关产品推荐
相关产品推荐

