2016-10-31 3 views
2

Я пытаюсь вернуть токен аутентификации в ответ на запрос graphql с именем пользователя и паролем в качестве аргументов, но почему-то graphql всегда возвращает null. Я могу распечатать токен перед его возвратом.Graphql schema return 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: "[email protected]" 
    password: "abc123") 
} 

Результат

{ 
    "data": { 
    "Token": null 
    } 
} 

, что я делаю неправильно здесь?

ответ

5

Резольвер должен вернуть значение 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); 
    }); 
    }) 
} 

Я не побежал этот код, чтобы убедиться, что он работает, но основная идея заключается в том, чтобы всегда возвращать значение для ваших резольверами и обратных вызовов, к сожалению, не позволяют это

+0

Это должно сработать! Nice и чистый – LordDave

+0

Это работало как шарм, спасибо. – Reneshankar