Graphql, node.js и sql, не может вернуть значение null для поля, не допускающего значение NULL

Я хочу вернуть данные, поступающие из БД, в API. Данные регистрируются, но не отображаются в API-интерфейсе graphql.

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.info(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
}

в чем проблема/вопрос?

Fermin 14.02.2019 09:36

Я хотел вернуть данные, поступающие из БД, в API, данные регистрируются, но не отображаются в API GraphQL. Результат API, который я вставил выше.

Sheikh Abbas 14.02.2019 09:39

Спасибо за исправление форматирования! :)

Daniel Rearden 14.02.2019 11:38
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
1 265
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Ваша функция getUsers ничего не возвращает. Я считаю, что вам не хватает оператора return, который я выделил в комментарии выше.

Кстати, в GraphQL рекомендуется гарантировать, что все корневые поля (такие как getUsers) обнуляемые, прочтите эта статья, чтобы узнать, почему.

У меня есть обратный результат в конце.

Sheikh Abbas 14.02.2019 09:32
Ответ принят как подходящий

Это ваш преобразователь:

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

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

Преобразователь GraphQL должен возвращать либо значение, либо обещание, которое будет разрешаться в значение. Впрочем, и здесь ты не вернешься. Имейте в виду, что обратные вызовы вызываются асинхронно, поэтому возврат значения внутри обратного вызова ничего не делает (в большинстве случаев).

Вы действительно должны использовать что-то вроде promise-mysql вместо mysql, но вы все равно можете обернуть обратный вызов обещанием и вернуть это обещание. Что-то вроде этого должно работать:

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

Можете ли вы также сказать мне код для мутатора, как добавить в эту базу данных. ?

Sheikh Abbas 14.02.2019 11:16

Это немного выходит за рамки этого вопроса. Вам нужно будет сделать один вызов query, чтобы вставить новую строку, а затем получить вставленную строку с помощью второго вызова query, который выбирает только что созданную строку. Я уверен, что существуют вопросы SO и руководства о том, как это сделать с помощью драйвера mysql; на самом деле это не специфично для GraphQL.

Daniel Rearden 14.02.2019 11:44

можете ли вы поделиться какой-либо связанной ссылкой для этого, я новичок в graphql и у меня много проблем.

Sheikh Abbas 14.02.2019 11:50

удалить (!) из определения поля в схеме

Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.

Community 01.01.2022 18:01

Другие вопросы по теме