2016-09-08 1 views
0

Ich habe erforscht und getestet, wie API-Aufrufe in Knoten js zu tun. Ich versuche derzeit, einen Teil eines JSON-Objekts zu verwenden, das von einem API-Aufruf in einem Modul zurückgegeben wird, um ein Token zurückzugeben.Wie verwende ich einen Teil eines zurückgegebenen Objekts aus einer API-Anfrage als das, was die Funktion zurückgibt?

var request = require("request"); 
var timestamp = require("unix-timestamp"); 
var jwt = require("jsonwebtoken"); 
var EventEmitter = require("events").EventEmitter; 

timestamp.round = true; 

//create current unix timestamp 
var current = timestamp.now(); 

//create unix experation time 
var experation = timestamp.add(current, "+5m"); 

//create header 
var header = {"header"} 

//create payload 
var payload = { 
    "iss": process.env.CKEY, 
    "aud": "https://iformbuilder.com/exzact/api/oauth/token", 
    "exp": experation, 
    "iat": current 
}; 

var signature = process.env.SKEY; 

//Create assertion 
var assert = jwt.sign(payload, signature); 
var grant = 'urn:ietf:params:oauth:grant-type:jwt-bearer'; 

//set the options 
var options = { method: 'POST', 
    url: 'https://iformbuilder.com/exzact/api/oauth/token', 
    qs: { 
    grant_type: grant, 
    assertion: assert 
    }, 
    headers: { 
    'content-type': 'application/x-www-form-urlencoded', 
    'cache-control': 'no-cache' 
    } 
}; 

var data = {}; 
var tkn = new EventEmitter(); 

module.exports = { 
    token: function() { 
     request(options, function (error, response, body) { 
      if (error) throw new Error(error); 
      console.log(body); 
      tkn.body = body; 
      tkn.emit('update'); 
     }); 

     tkn.on('update', function(){ 
      data = JSON.parse(tkn.body); 
      return data.access_token; 
     }); 
    } 
} 

Das Problem ist, dass ich das zurückgegebene Element nur im Rahmen von tkn.on verwenden kann. Ich kann einen weiteren API-Aufruf verschachteln, um das Token zu verwenden. Ich möchte es jedoch verwenden, ohne den gleichen Code erneut verwenden zu müssen. Die einzige Lösung, mit der ich arbeiten kann, ist das Schreiben in eine Datei. Ich frage mich, ob ich das überhaupt richtig mache. Ich kann anscheinend keine gute Quelle online finden, um mir dabei zu helfen und vielleicht stelle ich die falsche Frage.

+0

Wenn Ihr Modul eine asynchrone Methode verwendet, müssen Sie es asynchron konsumieren. Das heißt, Ihr Funktionsaufruf muss einen Parameter für eine Callback-Funktion annehmen und Sie müssen ihn in Ihren tkn.on (...) Callback aufrufen. Sehen Sie sich das Java-Callback-Muster an und, wenn Sie sich mutig fühlen, Js Promises. Folge dem weißen Hasen. –

Antwort

0

Sie haben einen Rückruf zu verwenden (oder Versprechen), um den Wert zu erhalten. Im Folgenden finden Sie ein Beispiel mit Rückrufen. Ich lasse Sie nach Versprechungen fragen. Ich würde sagen, verstehen Sie es mit Rückrufen zuerst dann weiter zu Versprechen.

someOtherModule.js

var tokenGetter = require('./tokenGetter'); 

function doSomethingWithToken(accessToken){ 
    //Do what you want with the token here 
} 

tokenGetter.token(doSomethingWithToken); 

tokenGetter.js

module.exports = { 
    token: function(callback) { 
     request(options, function (error, response, body) { 
      if (error) throw new Error(error); 
      console.log(body); 
      tkn.body = body; 
      tkn.emit('update'); 
     }); 

     tkn.on('update', function(){ 
      data = JSON.parse(tkn.body); 
      callback(data.access_token); 
     }); 
    } 
} 

Der Grund, warum Sie dies tun müssen, ist, weil mit asynchronen Operationen, Sie wissen nicht, wann Sie eine Antwort erhalten wird. Der Code ist nicht mehr linear wie zuvor.

Sie müssen Ihren Code anpassen, um seine Operationen fortzusetzen, WENN Sie eine Antwort erhalten, anstatt NACH dem Ausführen des Vorgangs.

+0

Vielen Dank. Ich werde das testen und anfangen, Callbacks und dann Promises zu betrachten. – Plaetzler

Verwandte Themen