如何使用 API 请求返回的对象的一部分作为函数 returns?
How do I use part of a returned object from an API request as what the function returns?
我一直在研究和测试如何在节点 js 中进行 API 调用。我目前正在尝试使用 JSON 对象的一部分,该对象从模块中的 API 调用中获取 returned 到 return 令牌。
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范围内使用returned项目。我可以在其中嵌套另一个 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);
});
}
}
你必须这样做的原因是因为对于异步操作,你不知道什么时候会得到响应。代码不再像以前那样线性。
您必须调整代码才能在收到响应时继续其操作,而不是在您执行操作之后。
我一直在研究和测试如何在节点 js 中进行 API 调用。我目前正在尝试使用 JSON 对象的一部分,该对象从模块中的 API 调用中获取 returned 到 return 令牌。
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范围内使用returned项目。我可以在其中嵌套另一个 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);
});
}
}
你必须这样做的原因是因为对于异步操作,你不知道什么时候会得到响应。代码不再像以前那样线性。
您必须调整代码才能在收到响应时继续其操作,而不是在您执行操作之后。