返回 null 的 Graphql 模式
Graphql schema returning null
我正在尝试 return 身份验证令牌以响应以用户名和密码作为参数的 graphql 查询,但不知何故 graphql 总是 returning null
。我可以在 return 之前打印令牌。
var {
GraphQLObjectType,
GraphQLInt,
GraphQLList,
GraphQLString,
GraphQLSchema
} = require('graphql');
let MyUser = require('./modules/user/user');
const Query = new GraphQLObjectType({
name: 'Query',
description : 'UserQuery',
fields: function(){
return {
Token :{
type: GraphQLString,
description : "Authentication token",
args: {
user_name: { type: GraphQLString },
password: { type: GraphQLString },
},
resolve(root, args){
let user = new MyUser();
user.authenticateUser(args.user_name, args.password, function(result){
console.log("token :"+result);
return result;
})
}
}
}
}
});
const Schema = new GraphQLSchema({
query: Query
});
module.exports = Schema;
查询看起来像
query{
Token(user_name: "Thurman.Cassin@hotmail.com"
password: "abc123")
}
结果
{
"data": {
"Token": null
}
}
我做错了什么?
解析器 必须 return JSON 值,或产生该值的承诺。在您的示例中,您使用回调来获取实际的 REST 查询:
user.authenticateUser(args.user_name, args.password, function(result){
console.log("token :"+result);
return result;
});
这行不通,因为它不会立即 return 一个值。你可以尝试这样的事情:
resolve(root, args){
let user = new MyUser();
return new Promise((resolve, reject) => {
user.authenticateUser(args.user_name, args.password, function(result){
console.log("token :"+result);
resolve(result);
});
})
}
我没有运行这段代码来确保它有效,但这个基本思想是始终return你的解析器和回调的值,不幸的是,不允许这样做
与你的情况无关,但由于你是 Google 搜索的第一个结果 "GraphQl query always returning null",我分享我的经验,希望对一些人有所帮助。
这是我最初的查询,总是 returning null:
query: new GraphQLObjectType({
name: 'RootQueryType2',
fields: {
allDatalogs: {
type: new GraphQLList(dataLogType),
resolve: (root, source, fieldASTs) => {
var foundItems = new Promise((resolve, reject) => {
DataLogMongo.find({}, (err, users) => {
if (err) {
reject(err);
} else {
resolve(users);
users.forEach(function (myDoc) {
console.log("datalog: " );
console.log(myDoc);
});
}
})
return foundItems
})
}
}
如您所见,return 语句位于 Promise(..) 括号内。但是,它必须明显地放在后面,这给了:
allDatalogs: {
type: new GraphQLList(dataLogType),
resolve: (root, source, fieldASTs) => {
var foundItems = new Promise((resolve, reject) => {
DataLogMongo.find({}, (err, users) => {
if (err) {
reject(err);
} else {
resolve(users);
users.forEach(function (myDoc) {
console.log("datalog: " );
console.log(myDoc);
});
}
})
})
return foundItems
}
}
然后我就能得到结果了。希望我有所帮助:)
我正在尝试 return 身份验证令牌以响应以用户名和密码作为参数的 graphql 查询,但不知何故 graphql 总是 returning null
。我可以在 return 之前打印令牌。
var {
GraphQLObjectType,
GraphQLInt,
GraphQLList,
GraphQLString,
GraphQLSchema
} = require('graphql');
let MyUser = require('./modules/user/user');
const Query = new GraphQLObjectType({
name: 'Query',
description : 'UserQuery',
fields: function(){
return {
Token :{
type: GraphQLString,
description : "Authentication token",
args: {
user_name: { type: GraphQLString },
password: { type: GraphQLString },
},
resolve(root, args){
let user = new MyUser();
user.authenticateUser(args.user_name, args.password, function(result){
console.log("token :"+result);
return result;
})
}
}
}
}
});
const Schema = new GraphQLSchema({
query: Query
});
module.exports = Schema;
查询看起来像
query{
Token(user_name: "Thurman.Cassin@hotmail.com"
password: "abc123")
}
结果
{
"data": {
"Token": null
}
}
我做错了什么?
解析器 必须 return JSON 值,或产生该值的承诺。在您的示例中,您使用回调来获取实际的 REST 查询:
user.authenticateUser(args.user_name, args.password, function(result){
console.log("token :"+result);
return result;
});
这行不通,因为它不会立即 return 一个值。你可以尝试这样的事情:
resolve(root, args){
let user = new MyUser();
return new Promise((resolve, reject) => {
user.authenticateUser(args.user_name, args.password, function(result){
console.log("token :"+result);
resolve(result);
});
})
}
我没有运行这段代码来确保它有效,但这个基本思想是始终return你的解析器和回调的值,不幸的是,不允许这样做
与你的情况无关,但由于你是 Google 搜索的第一个结果 "GraphQl query always returning null",我分享我的经验,希望对一些人有所帮助。
这是我最初的查询,总是 returning null:
query: new GraphQLObjectType({
name: 'RootQueryType2',
fields: {
allDatalogs: {
type: new GraphQLList(dataLogType),
resolve: (root, source, fieldASTs) => {
var foundItems = new Promise((resolve, reject) => {
DataLogMongo.find({}, (err, users) => {
if (err) {
reject(err);
} else {
resolve(users);
users.forEach(function (myDoc) {
console.log("datalog: " );
console.log(myDoc);
});
}
})
return foundItems
})
}
}
如您所见,return 语句位于 Promise(..) 括号内。但是,它必须明显地放在后面,这给了:
allDatalogs: {
type: new GraphQLList(dataLogType),
resolve: (root, source, fieldASTs) => {
var foundItems = new Promise((resolve, reject) => {
DataLogMongo.find({}, (err, users) => {
if (err) {
reject(err);
} else {
resolve(users);
users.forEach(function (myDoc) {
console.log("datalog: " );
console.log(myDoc);
});
}
})
})
return foundItems
}
}
然后我就能得到结果了。希望我有所帮助:)