【问题标题】:Graphql schema returning null [duplicate]Graphql模式返回null [重复]
【发布时间】: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
  }
}

我在这里做错了什么?

【问题讨论】:

    标签: node.js graphql graphql-js


    【解决方案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
                }
            }
    

    然后我就能得到结果。希望我有所帮助:)

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 2023-04-08
      • 2019-06-28
      • 2020-02-02
      • 2021-04-21
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多