2016-09-08 7 views
0

저는 노드 j에서 API 호출을 수행하는 방법을 연구하고 테스트했습니다. 현재 Token을 반환하기 위해 모듈에서 API 호출로부터 반환 된 JSON 객체의 일부를 사용하려고합니다.함수가 반환하는 값으로 API 요청에서 반환 된 객체의 일부를 어떻게 사용합니까?

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

문제점은 반환 된 항목을 tkn.on의 범위 내에서만 사용할 수 있다는 점입니다. 내에서 다른 API 호출을 중첩하여 토큰을 사용할 수 있습니다. 그러나 같은 코드를 다시 사용하지 않고도 사용하고 싶습니다. 내가 해결할 수있는 유일한 해결책은 파일에 쓰는 것입니다. 나는 이것이 올바른 방향으로 가고 있는지 궁금해. 나는 이것으로 나를 돕기 위해 온라인에서 좋은 정보원을 찾지 못하고 잘못된 질문을하고있다.

+0

모듈에서 일부 비동기 메서드를 사용하는 경우 비동기 적으로 사용해야합니다. 즉, 함수 호출은 콜백 함수의 매개 변수를 가져와야하고,이를 tkn.on (...) 콜백으로 호출해야합니다. javacript 콜백 패턴을 살펴보고, 용감하다고 느끼면 Js Promises. 흰 토끼를 따라 가라. –

답변

0

값을 얻으려면 콜백 (또는 약속)을 ​​사용해야합니다. 아래는 콜백이있는 예입니다. 약속을 연구하도록하겠습니다. 나는 콜백 (callbacks)을 먼저 이해하고 약속을 이행하는 것으로 이해합니다. 당신이 응답을 얻을 때 비동기 작업과 함께, 당신이 알고하지 않기 때문에

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

이 작업을 수행해야하는 이유입니다. 코드는 이전과 같은 방식으로 더 이상 선형 적이 지 않습니다.

작업을 수행 한 후에 응답을받을 때 작업을 계속하려면 코드를 조정해야합니다.

+0

고마워요. 이것을 시험해보고 콜백과 약속을 살펴 보겠습니다. – Plaetzler