2016-10-31 2 views
2

Ich versuche, ein Authentifizierungstoken als Antwort auf eine Abfrage von graphql mit Benutzername und Kennwort als Argumente zurückzugeben, aber irgendwie gibt graphql immer null zurück. Ich kann das Token kurz vor der Rückgabe ausdrucken.Graphql-Schema gibt null zurück

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; 

Abfrage aussehen wie

query{ 
    Token(user_name: "[email protected]" 
    password: "abc123") 
} 

Ergebnis

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

was ich hier falsch mache?

Antwort

5

Der Resolver muss den JSON-Wert oder eine Zusage, die zu diesem Wert führt, zurückgeben. In Ihrem Beispiel verwenden Sie einen Rückruf, um die tatsächliche REST Abfrage zu holen:

user.authenticateUser(args.user_name, args.password, function(result){ 
    console.log("token :"+result); 
    return result; 
}); 

Das wird nicht funktionieren, da es nicht sofort einen Wert zurück. Sie können so etwas wie dies versuchen:

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); 
    }); 
    }) 
} 

Ich habe den Code nicht lief, um sicherzustellen, es funktioniert, aber diese Grundidee ist es, immer einen Wert für Ihren Resolver und Rückrufe zurückzukehren, leider nicht erlauben für diese

+0

Dies sollte funktionieren! Schön und sauber – LordDave

+0

Das hat wie ein Zauber funktioniert, Danke. – Reneshankar