GraphQL-tools:如何编写resolver函数实现列表按ID查询并解决非空报错
问题根因
- 你当前使用的
Array.map()方法不符合需求:map会返回和原数组长度一致的新数组,匹配到对应id时返回link对象,未匹配的位置返回undefined,最终resolver返回的是数组而非Schema要求的单个Link对象,GraphQL解析url字段时无法取到对应属性返回null,触发非空字段报错。 - 如果你之前测试
Array.find()未成功,大概率是写法错误,find本身就是返回第一个符合匹配条件的单个元素,完全适配这个查询场景。
修复方案
直接替换link resolver的实现即可:
const resolvers = { Query: { feed: () => links, link: (parent, args) => links.find(link => link.id === args.id), }, }
补充说明
当前Schema中link字段定义为Link!非空类型,如果传入的id不存在,find会返回null,仍会触发非空报错。如果需要兼容id不存在的场景,可以做两种调整:
- 将Schema中
link字段定义改为link(id: ID!): Link,允许返回空 - 在resolver中添加兜底逻辑,当
find返回空时抛出明确的「ID不存在」错误
内容的提问来源于stack exchange,提问作者ezeYaniv
相关产品推荐
相关产品推荐

