RESTful 返回空响应的 GraphQL
GraphQL with RESTful returning empty response
我正在将 GraphQL
与 REST
端点连接,我确认无论何时调用 http://localhost:3001/graphql
它都会到达 REST
端点并返回 JSON
对 GraphQL
服务器的响应,但我从 GraphQL
服务器到 GUI
的响应为空,如下所示:
{
"data": {
"merchant": {
"id": null
}
}
}
查询(手动解码):
http://localhost:3001/graphql?query={
merchant(id: 1) {
id
}
}
下面是我的 GraphQLObjectType
的样子:
const MerchantType = new GraphQLObjectType({
name: 'Merchant',
description: 'Merchant details',
fields : () => ({
id : {
type: GraphQLString // ,
// resolve: merchant => merchant.id
},
email: {type: GraphQLString}, // same name as field in REST response, so resolver is not requested
mobile: {type: GraphQLString}
})
});
const QueryType = new GraphQLObjectType({
name: 'Query',
description: 'The root of all... queries',
fields: () => ({
merchant: {
type: merchant.MerchantType,
args: {
id: {type: new GraphQLNonNull(GraphQLID)},
},
resolve: (root, args) => rest.fetchResponseByURL(`merchant/${args.id}/`)
},
}),
});
来自 REST
端点的响应(我也尝试在 JSON 中使用单个对象而不是 JSON 数组):
[
{
"merchant": {
"id": "1",
"email": "a@b.com",
"mobile": "1234567890"
}
}
]
REST 调用使用 node-fetch
function fetchResponseByURL(relativeURL) {
return fetch(`${config.BASE_URL}${relativeURL}`, {
method: 'GET',
headers: {
Accept: 'application/json',
}
})
.then(response => {
if (response.ok) {
return response.json();
}
})
.catch(error => { console.log('request failed', error); });
}
const rest = {
fetchResponseByURL
}
export default rest
GitHub: https://github.com/vishrantgupta/graphql
JSON 端点(虚拟):https://api.myjson.com/bins/8lwqk
编辑: 添加 node.js
标签,promise 对象可能有问题。
您的 fetchResponseByURL 函数获取空字符串。
我认为主要问题是您使用了错误的函数来获取您的 JSON 字符串,请尝试安装 request-promise 并使用它来获取你的 JSON 字符串。
https://github.com/request/request-promise#readme
类似于
var rp = require('request-promise');
function fetchResponseByURL(relativeURL) {
return rp('https://api.myjson.com/bins/8lwqk')
.then((html) => {
const data = JSON.parse(html)
return data.merchant
})
.catch((err) => console.error(err));
// .catch(error => { console.log('request failed', error); });
}
在这种情况下,使用 data.merchant
解决了我的问题。但是上面建议的解决方案,即使用 JSON.parse(...)
可能不是最佳实践,因为如果 JSON 中没有对象,则预期响应可能如下所示:
{
"data": {
"merchant": null
}
}
而不是字段 null
。
{
"data": {
"merchant": {
"id": null // even though merchant is null in JSON,
// I am getting a merchant object in response from GraphQL
}
}
}
我已经用工作代码更新了我的 GitHub:https://github.com/vishrantgupta/graphql。
我正在将 GraphQL
与 REST
端点连接,我确认无论何时调用 http://localhost:3001/graphql
它都会到达 REST
端点并返回 JSON
对 GraphQL
服务器的响应,但我从 GraphQL
服务器到 GUI
的响应为空,如下所示:
{
"data": {
"merchant": {
"id": null
}
}
}
查询(手动解码):
http://localhost:3001/graphql?query={
merchant(id: 1) {
id
}
}
下面是我的 GraphQLObjectType
的样子:
const MerchantType = new GraphQLObjectType({
name: 'Merchant',
description: 'Merchant details',
fields : () => ({
id : {
type: GraphQLString // ,
// resolve: merchant => merchant.id
},
email: {type: GraphQLString}, // same name as field in REST response, so resolver is not requested
mobile: {type: GraphQLString}
})
});
const QueryType = new GraphQLObjectType({
name: 'Query',
description: 'The root of all... queries',
fields: () => ({
merchant: {
type: merchant.MerchantType,
args: {
id: {type: new GraphQLNonNull(GraphQLID)},
},
resolve: (root, args) => rest.fetchResponseByURL(`merchant/${args.id}/`)
},
}),
});
来自 REST
端点的响应(我也尝试在 JSON 中使用单个对象而不是 JSON 数组):
[
{
"merchant": {
"id": "1",
"email": "a@b.com",
"mobile": "1234567890"
}
}
]
REST 调用使用 node-fetch
function fetchResponseByURL(relativeURL) {
return fetch(`${config.BASE_URL}${relativeURL}`, {
method: 'GET',
headers: {
Accept: 'application/json',
}
})
.then(response => {
if (response.ok) {
return response.json();
}
})
.catch(error => { console.log('request failed', error); });
}
const rest = {
fetchResponseByURL
}
export default rest
GitHub: https://github.com/vishrantgupta/graphql
JSON 端点(虚拟):https://api.myjson.com/bins/8lwqk
编辑: 添加 node.js
标签,promise 对象可能有问题。
您的 fetchResponseByURL 函数获取空字符串。
我认为主要问题是您使用了错误的函数来获取您的 JSON 字符串,请尝试安装 request-promise 并使用它来获取你的 JSON 字符串。
https://github.com/request/request-promise#readme
类似于
var rp = require('request-promise');
function fetchResponseByURL(relativeURL) {
return rp('https://api.myjson.com/bins/8lwqk')
.then((html) => {
const data = JSON.parse(html)
return data.merchant
})
.catch((err) => console.error(err));
// .catch(error => { console.log('request failed', error); });
}
在这种情况下,使用 data.merchant
解决了我的问题。但是上面建议的解决方案,即使用 JSON.parse(...)
可能不是最佳实践,因为如果 JSON 中没有对象,则预期响应可能如下所示:
{
"data": {
"merchant": null
}
}
而不是字段 null
。
{
"data": {
"merchant": {
"id": null // even though merchant is null in JSON,
// I am getting a merchant object in response from GraphQL
}
}
}
我已经用工作代码更新了我的 GitHub:https://github.com/vishrantgupta/graphql。