Graphql,node.js和sql,对于不可为空的字段无法返回null [英] Graphql, node.js and sql,Cannot return null for non-nullable field

查看:128
本文介绍了Graphql,node.js和sql,对于不可为空的字段无法返回null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想将来自db的数据返回给api.正在记录数据,但没有显示在graphql api上.

I want to return data coming from db to the api. The data is being logged but not showing on the 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
}

推荐答案

这是您的解析器:

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.但是,在这里,您都不返回任何一个.请记住,回调是异步调用的,因此在大多数情况下,在回调内返回值都不会执行任何操作.

A GraphQL resolver must return either a value or a Promise that will resolve to a value. However, here, you're not returning either. Keep in mind that callbacks are invoked asynchronously, so returning a value inside a callback does nothing (in most cases).

您确实应该使用诸如 promise-mysql 之类的东西代替 mysql ,但是您仍然可以使用Promise包装回调并返回该Promise.这样的事情应该起作用:

You really should use something like promise-mysql instead of mysql, but you can still wrap a callback with a Promise and return that Promise. Something like this should work:

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)
      }
    })
  })
},

这篇关于Graphql,node.js和sql,对于不可为空的字段无法返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆