【问题标题】:Graphql, node.js and sql,Cannot return null for non-nullable fieldGraphql、node.js 和 sql,不能为不可为空的字段返回 null
【发布时间】:2019-07-08 04:49:41
【问题描述】:

我想将来自 db 的数据返回到 api。正在记录数据,但未在 graphql api 上显示。

const express = require('express');
const bodyParser = require('body-parser');
const graphqlHttp = require('express-graphql');
const { buildSchema } = require('graphql');
var mysql = require('mysql');

const app = express();  

//start mysql connection    
var connection = mysql.createConnection({    
  host     : 'localhost', //mysql database host name    
  user     : 'root', //mysql database user name    
  password : '', //mysql database password    
  database : 'test' //mysql database name    
});

connection.connect(function(err) {    
  if (err) throw err      
})    

//end mysql connection

app.use(bodyParser.json());    
app.use(    
  '/graphql',    
  graphqlHttp({
    schema: buildSchema(`
        type users {
          id: String!
          username: String!
          password: String!
          role: String!
          name: String!
          photo: String!
        }
        type RootQuery {
            getUsers: [users!]!
        }
        type RootMutation {
          createUsers(name: String): String
        }
        schema {
            query: RootQuery
            mutation: RootMutation
        }
    `),
    rootValue: {
      getUsers: () => {
        connection.query('select * from users', function (error, results, fields) {
          if (error) throw error;
          console.log(JSON.stringify(results))
          return JSON.stringify(results) ;
        });
      },
      createUsers: (args) => {
        const eventName = args.name;
        return eventName;
      }
    },
    graphiql: true
  })
);

app.listen(3000);

结果:

query
{
  getUsers {
    id
  }  
}

输出:

{
  "errors": [
    {
      "message": "Cannot return null for non-nullable field RootQuery.getUsers.",
      "locations": [
        {
          "line": 3,
          "column": 3
        }
      ],
      "path": [
        "getUsers"
      ]
    }
  ],
  "data": null
}

【问题讨论】:

  • 有什么问题/疑问?
  • 我想将来自 db 的数据返回到 api,数据正在记录但未显示在 graphql api 上。我上面粘贴的api结果。
  • 感谢您修复格式! :)

标签: sql node.js graphql


【解决方案1】:

从架构中的字段定义中删除 (!)

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

这是你的解析器:

getUsers: () => {
  connection.query('select * from users', function (error, results, fields) {
    if (error) throw error;

    //users = results;
    console.log(JSON.stringify(results));
    return JSON.stringify(results) ;
  });
},

GraphQL 解析器必须返回一个值或将解析为一个值的 Promise。但是,在这里,您也不会返回。请记住,回调是异步调用的,因此在回调中返回一个值不会执行任何操作(在大多数情况下)。

您确实应该使用promise-mysql 之类的东西而不是mysql,但是您仍然可以使用Promise 包装回调并返回该Promise。这样的事情应该可以工作:

getUsers: () => {
  // Note, we have to return the Promise here
  return new Promise((resolve, reject) => {
    connection.query('select * from users', (error, results, fields) => {
      if (error) {
        reject(error)
      } else {
        // Don't stringify
        resolve(results)
      }
    })
  })
},

【讨论】:

  • 你能告诉我修改器的代码吗,如何在这个数据库中添加。 ?
  • 这有点超出了这个问题的范围。您需要进行一次query 调用以插入新行,然后使用第二个query 调用选择新创建的行来获取插入的行。我确信有关于如何使用mysql 驱动程序来做到这一点的现有 SO 问题和教程;它并不是真正特定于 GraphQL 的。
  • 你能分享任何相关的链接吗,我是graphql的初学者,有很多问题。
【解决方案3】:
  getUsers: () => {
    /* ? return ? */ connection.query('select * from users', function (error, results, fields) {
      if (error) throw error;

      //users = results;
      console.log(JSON.stringify(results));
      return JSON.stringify(results) ;
    });
  },

您的getUsers 函数不返回任何内容。我相信您错过了我在上述评论中强调的退货声明。

顺便说一句,GraphQL 的最佳做法是确保所有根字段(例如 getUsers)都可以为空,请阅读 this article 以了解原因。

【讨论】:

  • 我最后有返回结果。
猜你喜欢
  • 2019-10-25
  • 2019-05-28
  • 2023-03-28
  • 2021-08-18
  • 2021-11-27
  • 2021-10-24
  • 2021-08-06
  • 2021-10-29
  • 2021-10-07
相关资源
最近更新 更多