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 在突变时返回 null [重复]

GraphQL Apollo 无法为不可空返回 Null [重复]

带有 Stripe 和 MongoDB 集成的 GraphQL 突变过早返回 null [重复]

Nest JS GraphQL“不能为非空返回null” [重复]

GraphQL graph.cool 用户查询不适用于 Auth0 令牌

GraphQL 嵌套文档在突变时返回 null