返回 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
            }
        }

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