Разрешить асинхронную функцию Graphql, которая не может возвращать данные, запрошенные через сервер Stardog, имеющий данные rdf
Я пытаюсь запросить сервер Stardog с помощью GraphQl ниже мой код.
import {
GraphQLSchema,
GraphQLObjectType,
GraphQLInt,
GraphQLString,
GraphQLList,
GraphQLNonNull,
GraphQLID,
GraphQLFloat
} from 'graphql';
import axios from 'axios';
var stardog = require("stardog");
let Noun = new GraphQLObjectType({
name: "Noun",
description: "Basic information on a GitHub user",
fields: () => ({
"c": {
type: GraphQLString,
resolve: (obj) => {
console.log(obj);
}
}
})
});
const query = new GraphQLObjectType({
name: "Query",
description: "First GraphQL for Sparql Endpoint Adaptive!",
fields: () => ({
noun: {
type: Noun,
description: "Noun data from fibosearch",
args: {
noun_value: {
type: new GraphQLNonNull(GraphQLString),
description: "The GitHub user login you want information on",
},
},
resolve: (_,{noun_value}) => {
var conn = new stardog.Connection();
conn.setEndpoint("http://stardog.edmcouncil.org");
conn.setCredentials("xxxx", "xxxx");
conn.query({
database: "jenkins-stardog-load-fibo-30",
query: `select ?c where {?s rdfs:label '${noun_value}'. ?c rdfs:subClassOf ?s}`,
limit: 10,
offset: 0
},
function (data) {
console.log(data.results.bindings);
return data.results.bindings;
});
}
},
})
});
const schema = new GraphQLSchema({
query
});
export default schema;
Запрос выполнен успешно, и я могу увидеть результат на консоли, но return data.results.bindings;
внутри function(data)
не возвращает этот результат Noun
система типов под resolve: (obj) => { console.log(obj); }
и obj
возвращено показывает ноль вместо результата bindings
возвращается из запроса GraphQL. Было бы здорово, если бы кто-нибудь помог мне понять, чего мне здесь не хватает.
Заранее спасибо, Яшпал
1 ответ
В вашем запросе resolve
функция noun
Поле является асинхронной операцией (часть запроса). Но ваш код синхронен. Таким образом, на самом деле ничего не возвращается немедленно из функции разрешения. В результате ничего не передается функции разрешения Noun
Тип объекта GraphQL. Вот почему вы получаете ноль, когда вы печатаете obj
,
В случае асинхронных операций в resolve
функции, вы должны вернуть объект обещания, который разрешается с вашим намеченным результатом. Вы также можете использовать функцию ES7 async/await; в этом случае вы должны объявить resolve: async (_, {noun_value}) => { // awaited code}
,
С Promise
код будет выглядеть так:
resolve: (_,{noun_value}) => {
var conn = new stardog.Connection();
conn.setEndpoint("http://stardog.edmcouncil.org");
conn.setCredentials("xxxx", "xxxx");
return new Promise(function(resolve, reject) {
conn.query({
database: "jenkins-stardog-load-fibo-30",
query: `select ?c where {?s rdfs:label '${noun_value}'. ?c rdfs:subClassOf ?s}`,
limit: 10,
offset: 0
}, function (data) {
console.log(data.results.bindings);
if (data.results.bindings) {
return resolve(data.results.bindings);
} else {
return reject('Null found for data.results.bindings');
}
});
});
}