Я хочу вернуть данные, поступающие из БД, в 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
}
Я хотел вернуть данные, поступающие из БД, в API, данные регистрируются, но не отображаются в API GraphQL. Результат API, который я вставил выше.
Спасибо за исправление форматирования! :)


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) обнуляемые, прочтите эта статья, чтобы узнать, почему.
У меня есть обратный результат в конце.
Это ваш преобразователь:
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)
}
})
})
},
Можете ли вы также сказать мне код для мутатора, как добавить в эту базу данных. ?
Это немного выходит за рамки этого вопроса. Вам нужно будет сделать один вызов query, чтобы вставить новую строку, а затем получить вставленную строку с помощью второго вызова query, который выбирает только что созданную строку. Я уверен, что существуют вопросы SO и руководства о том, как это сделать с помощью драйвера mysql; на самом деле это не специфично для GraphQL.
можете ли вы поделиться какой-либо связанной ссылкой для этого, я новичок в graphql и у меня много проблем.
удалить (!) из определения поля в схеме
Ваш ответ может быть улучшен с помощью дополнительной вспомогательной информации. Пожалуйста, редактировать добавьте дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Дополнительную информацию о том, как писать хорошие ответы, можно найти в справочном центре.
в чем проблема/вопрос?