Javascript 解析Graphql的异步函数无法返回通过具有rdf数据的Stardog服务器查询的数据

Javascript 解析Graphql的异步函数无法返回通过具有rdf数据的Stardog服务器查询的数据,javascript,node.js,rdf,graphql,stardog,Javascript,Node.js,Rdf,Graphql,Stardog,我正在尝试使用graphql查询stardog服务器,下面是我的代码 import { GraphQLSchema, GraphQLObjectType, GraphQLInt, GraphQLString, GraphQLList, GraphQLNonNull, GraphQLID, GraphQLFloat } from 'graphql'; import axios from 'axios'; var stardog = require("stardo

我正在尝试使用graphql查询stardog服务器,下面是我的代码

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;
查询成功执行,我可以在控制台上看到结果,但
返回data.results.bindings内部
函数(数据)
不会将此结果返回到
解析:(obj)=>{console.log(obj);}
返回的
obj
显示为null,而不是从GraphQL查询返回的结果
bindings
。如果有人能帮我找出我在这里遗漏了什么,那就太好了

提前感谢,,
Yashpal

在查询中,
名词
字段的
解析
函数是一个异步操作(查询部分)。但是你的代码是同步的。因此,解析函数实际上不会立即返回任何内容。这导致没有任何内容传递给
Noun
GraphQL对象类型的resolve函数。这就是为什么在打印
obj
时会出现空值

如果在
resolve
函数中执行异步操作,则必须返回一个使用预期结果进行解析的承诺对象。您还可以使用ES7异步/等待功能;在这种情况下,您必须声明
resolve:async({noun\u value})=>{//waitived code}

使用,代码将如下所示:

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');
      }
    });
  });
}

感谢Ahmad,我已经按照您的建议更新了代码,但是新承诺((resolve,reject))字段的服务器出现语法错误,尽管我已经安装了Promise包并将var Promise=require(“Promise”);很可能您没有使用ES6。我已经在代码中替换了箭头函数。如果你现在有语法错误,请告诉我。万分感谢艾哈迈德,我终于可以在你的指导下运行了。:@Yashpal,听到这个消息很高兴。您可能希望接受答案;-)当console.log(obj)运行时,我无法在GraphiQL UI上获得查询的解析结果;[{c:{type:'uri',value:'spec.edmcouncil.org/fibo/FND/Arrangements/ClassificationSchemes/..;}},{c:{type:'uri',value:'spec.edmcouncil.org/fibo/FND/Arrangements/Quantities/..;}]但在图形用户界面中,结果显示如下:{“数据”:{“名词”:{“c:[“[object object object object object object object object],“] } } }