如何从API请求中使用返回对象的一部分作为函数返回的内容

How do I use part of a returned object from an API request as what the function returns?

本文关键字:返回 一部分 函数 对象 请求 API      更新时间:2023-09-26

我一直在研究和测试如何在node js中进行API调用。我目前正在尝试使用从模块中的API调用返回的JSON对象的一部分来返回令牌。

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调用来使用令牌。然而,我想使用它,而不必再次使用相同的代码。我能找到的唯一解决方案是写入文件。我甚至在想我的做法是否正确。我似乎在网上找不到任何好的资源来帮助我,也许我问错了问题。

您必须使用回调(或承诺)来获取值。下面是一个回调的例子,我让你研究一下承诺。我想说,先用回调来理解它,然后再去理解承诺。

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

必须这样做的原因是,对于异步操作,您不知道何时会得到响应。代码不再像以前那样是线性的。

你必须调整你的代码来继续它的操作,当你得到一个响应,而不是在你完成操作后。