Graphql模式返回null [重复]
Posted
技术标签:
【中文标题】Graphql模式返回null [重复]【英文标题】:Graphql schema returning null [duplicate] 【发布时间】:2017-03-13 21:05:21 【问题描述】:我试图返回一个身份验证令牌以响应带有用户名和密码作为参数的 graphql 查询,但不知何故,graphql 总是返回 null
。我可以在返回之前打印令牌。
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
我在这里做错了什么?
【问题讨论】:
【参考方案1】:解析器必须返回 JSON 值,或产生该值的承诺。在您的示例中,您使用回调来获取实际的 REST 查询:
user.authenticateUser(args.user_name, args.password, function(result)
console.log("token :"+result);
return result;
);
这不起作用,因为它不会立即返回值。你可以试试这样:
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);
);
)
我没有运行此代码以确保其正常工作,但这个基本想法是始终为您的解析器和回调返回一个值,不幸的是,不允许这样做
【讨论】:
这应该可以!干净整洁 这很有魅力,谢谢。【参考方案2】:与您的情况无关,但由于您是 Google 搜索“GraphQl 查询始终返回 null”的第一个结果,所以我分享我的经验,希望对一些人有所帮助。
这是我的原始查询,总是返回 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
然后我就能得到结果。希望我有所帮助:)
【讨论】:
以上是关于Graphql模式返回null [重复]的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL Apollo 无法为不可空返回 Null [重复]
带有 Stripe 和 MongoDB 集成的 GraphQL 突变过早返回 null [重复]
Nest JS GraphQL“不能为非空返回null” [重复]