Разрешить асинхронную функцию 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');
      }
    });
  });
}
Другие вопросы по тегам