Javascript 解析Graphql的异步函数无法返回通过具有rdf数据的Stardog服务器查询的数据
我正在尝试使用graphql查询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
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],“] } } }