提前感谢您的帮助。
我正在尝试解决一个问题,这个问题几乎已经持续了几个星期,现在开始和关闭(试图自己解决)我很困难。
基本上我有一个场景,我将数据调用发送到身份服务器(Oauth 2.0)以检索随后在API调用中使用的令牌。
为此,我在NodeJS中设置了两个对请求模块的调用。第一个调用查询服务器,而第二个调用需要使用第一个调用中检索到的令牌来访问我正在访问的API。
我无法弄清楚如何从第一个调用(令牌)获取第二个请求可访问的变量。我一直认为它是从控制台中未定义的。
这是我到目前为止尝试过的代码。相关变量。尝试将变量令牌通过请求2,因为我需要api调用的令牌。我在一个名为dostuff的函数中运行这些请求。
var request = require('request');
var http = require('http');
var fs = require('fs');
var options = {
url: 'https://identitywebsite.com/connect/token',
headers: {'authorization' : 'basic <<KEY>>', 'Content-Type' : 'application/x-www-form-urlencoded'},
port: '443',
path: '/users',
method: 'POST',
body: 'grant_type=password&username=<<USERNAME>>&password=<<PASSWORD>>&scope=read+write'
var dostuff = function() {
request(options, function(error, response, body){
console.log("success");
Data = JSON.parse(body);
//console.log(xx);
global.token = data.access_token;
})
};
var options2 = {
url: 'https://apiwebsite.com',
headers: {'authorization' : 'Bearer ' + token, 'Content-Type' : 'application/json'},
port: '443',
path: '/users',
method: 'GET'
}
console.log(options2);
request(options2, function(error, response, apiresponse){
console.log("triggered");
console.log(" data success2");
apidata = JSON.parse(apiresponse);
console.log(apidata);
});
答案 0 :(得分:0)
你应该做的一些事情。一个是使用一些承诺。也尽力不使用全局变量。
您还缺少第一个选项的结束括号。
承诺真的很整洁,因为你可以做这样的事情。
do_something(options)
.then(function(my_data){
var options2 = {
url: 'https://apiwebsite.com',
headers: {'authorization' : 'Bearer ' + my_data, 'Content-Type' : 'application/json'},
port: '443',
path: '/users',
method: 'GET'
}
do_something_else(options2)
.then(function(my_other_data){
//do stuff with my_other_data
}
}
使用此库!它使请求的承诺变得非常简单!
https://github.com/request/request-promise,您也可以在bluebird中执行此操作,这是我最喜欢的所有promise库,但它稍微复杂一点。
编辑:
因为有人发布这是不合适的话题,但事实并非如此。我将深入探讨为什么这不符合你的想法。其中一个原因是工作不正常,Node.JS是异步的。
这意味着您的代码不会在运行第二个请求之前等待您的第一个请求完成,因此在下一个请求需要之前您实际上并未获得该令牌。
解决这个问题的方法之一就是像我原先说的那样使用承诺。那里有很多强制同步的图书馆。有这个库例如:
https://github.com/yortus/asyncawait
还有很多。
你可以抽象得更远,并从你的第二个请求中调用你的第一个请求,以获取API密钥并存储它。