2016-10-31 12 views
2

usernameとpasswordを引数とするgraphqlクエリーに対する応答として認証トークンを返そうとしていますが、graphqlは常にnullを返しています。返す直前にトークンを印刷することができます。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: "[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

これは動作するはずです!ニースとクリーン – LordDave

+0

それは魅力のように働いた、ありがとう。 – Reneshankar

関連する問題