GraphQL 查询返回错误“不能为不可为空的字段返回 null”

Posted

技术标签:

【中文标题】GraphQL 查询返回错误“不能为不可为空的字段返回 null”【英文标题】:GraphQL query returns error "Cannot return null for non-nullable field" 【发布时间】:2019-05-28 11:02:56 【问题描述】:

我有一个基本的 GraphQL 查询设置如下:

Query.js:

const Query = 
    dogs(parent, args, ctx, info) 
        return [ name: 'Snickers' ,  name: 'Sunny' ];
    ,
;

module.exports = Query;

schema.graphql:

type Dog 
    name: String!

type Query 
    dogs: [Dog]!


我创建了一个函数createServer() 用于启动服务器,如下所示:

const  GraphQLServer  = require('graphql-yoga');
const Mutation = require('./resolvers/Mutation');
const Query = require('./resolvers/Query');
const db = require('./db');

function createServer() 
    return new GraphQLServer(
        typeDefs: 'src/schema.graphql',
        resolvers: 
            Mutation,
            Query,
        ,
        resolverValidationOptions: 
            requireResolversForResolveType: false,
        ,
        context: req => ( ...req, db ),
    );


module.exports = createServer;

然后我尝试如下查询dogs

query 
  dogs 
    name
  

但是我没有从狗数组中获取名字,而是得到了以下错误:


  "data": null,
  "errors": [
    
      "message": "Cannot return null for non-nullable field Query.dogs.",
      "locations": [
        
          "line": 2,
          "column": 3
        
      ],
      "path": [
        "dogs"
      ]
    
  ]

似乎是什么导致了这个错误?

【问题讨论】:

听起来您没有正确导入 Query.js 或者您的解析器设置不正确。请展示其余相关代码,包括如何构造解析器对象以及如何向 GraphQLServer 构造函数提供类型定义和解析器。 @DanielRearden 好的,等等。 @DanielRearden 我的prisma.graphql 有超过 300 行代码。我应该复制其中的某个部分还是要我复制整个内容? 奇怪,我可以运行具有上述 typeDef 和解析器的graphql-yoga 服务器没有问题。除非./resolvers/Query 不是Query 的正确路径,否则我不确定还有什么问题:/ 如果它是一个不正确的路径节点将无法解析它并抛出错误:"Error: Cannot find module ..." 并且服务器将关闭。看起来它确实解析了,但是解析为一个空对象,所以 dogs 解析器不存在。你确定Query.js 导出是正确的吗? 【参考方案1】:

上面的代码如你在codesandbox中看到的那样工作:https://codesandbox.io/s/olzj9vvpk5

但是当我将 Query 转换为 之类的东西时,它会返回相同的错误,因此请检查您的路径和 console.log 查询以验证路径。您的导出看起来正确,但您可能忘记保存文件,正如我从课程入门文件中看到的那样,查询是 。请仔细检查。

此外,如果此代码在公共 git 存储库中,请分享链接。

【讨论】:

问题显然是我的一个文件中的拼写错误。我将您的答案标记为正确,因为您的 codepen 帮助我找到了错字。干杯。【参考方案2】:

我知道这个问题已经得到解答,但对我来说,解决这个问题的唯一方法就是传递 info 参数。

【讨论】:

【参考方案3】:

就我而言,我在 src 文件夹中创建了一个新的 Query.js 文件,但我使用 Query = require('./resolvers/Query') 导入 Query 并在那里编码。所以,试着检查一下路径,我认为问题就在那里。

【讨论】:

【参考方案4】:

此问题来自 AWS 要求 dynamoDB 表中的某些标准值,例如 createdAt 和 updatedAd,只需在 dynamo db 中手动添加这些字段并带有时间戳以便进一步测试。总是需要通过 id 请求突变,当我的架构是由放大代码生成创建时,我不清楚这一点......

【讨论】:

以上是关于GraphQL 查询返回错误“不能为不可为空的字段返回 null”的主要内容,如果未能解决你的问题,请参考以下文章

AWS放大graphql突变:不能为不可为空的字段返回null

使用 Graphql 在 NestJS 上订阅时,“不能为不可为空的字段返回 null”

Apollo GraphQL“不能为不可为空的字段 Mutation.createUser 返回 null”

Gatsby graphiQL - 不能为不可为空的字段 ImageSharpFluid.src 返回 null

无法解析自定义对象 graphql 架构

GraphQL 查询 - 抑制非空错误并返回部分数据