Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在第二个请求中使用oauth令牌-NODEJS_Javascript_Node.js_Variables_Oauth - Fatal编程技术网

Javascript 在第二个请求中使用oauth令牌-NODEJS

Javascript 在第二个请求中使用oauth令牌-NODEJS,javascript,node.js,variables,oauth,Javascript,Node.js,Variables,Oauth,提前谢谢你的帮助 我正在努力解决一个困扰了我好几个星期的问题,现在断断续续地(我自己也试着解决),我被卡住了 基本上,我有一个场景,我向identity server(Oauth 2.0)发送一个数据调用,以检索一个令牌,然后在API调用中使用该令牌 为此,我在NodeJS中设置了两个对请求模块的调用。第一个调用查询服务器,而第二个调用需要使用在第一个调用中检索到的令牌来访问我正在访问的API 我不知道如何从第一个调用(令牌)获取变量,以便第二个请求可以访问。我一直从控制台得知它是未定义的 这是

提前谢谢你的帮助

我正在努力解决一个困扰了我好几个星期的问题,现在断断续续地(我自己也试着解决),我被卡住了

基本上,我有一个场景,我向identity server(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);   

});
var request=require('request');
var http=require('http');
var fs=需要('fs');
变量选项={
网址:'https://identitywebsite.com/connect/token',
标题:{'authorization':'basic','Content Type':'application/x-www-form-urlencoded'},
端口:'443',
路径:'/users',
方法:“POST”,
正文:'grant_type=password&username=&password=&scope=read+write'
var dostuff=函数(){
请求(选项、功能(错误、响应、正文){
控制台日志(“成功”);
Data=JSON.parse(body);
//控制台日志(xx);
global.token=data.access\u token;
})
};
var选项2={
网址:'https://apiwebsite.com',
标题:{'authorization':'Bearer'+令牌,'Content Type':'application/json'},
端口:'443',
路径:'/users',
方法:“获取”
}
控制台日志(选项2);
请求(选项2,功能(错误、响应、apiresponse){
控制台日志(“已触发”);
console.log(“数据成功2”);
apidata=JSON.parse(apiresponse);
console.log(apidata);
});

好吧,有几件事你应该做。一件是使用一些承诺。另外,尽量不要使用全局变量

此外,您的第一个选项缺少一个右括号

不过,承诺确实很简洁,因为你可以做这样的事情

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
                                            }
                }
使用这个库!它使用请求做承诺变得非常容易

,您也可以在bluebird中执行此操作,bluebird是所有promise库中我最喜欢的,但它稍微复杂一些

编辑:

因为有人发表文章说这是离题的,而事实并非如此。我将进一步深入探讨为什么这不能按您认为的方式工作。这不能正常工作的原因之一是Node.JS是异步的

这意味着您的代码在运行第二个请求之前没有等待第一个请求完成,因此在下一个请求需要令牌之前,您实际上没有获得令牌

解决这一问题的方法之一是使用我最初说过的承诺。有很多库强制同步。例如:

还有更多


您可以将其进一步抽象,并从第二个请求调用第一个请求,以获取API密钥并存储它。

好的,您应该做一些事情。一是使用一些承诺。另外,请尽量不要使用全局变量

此外,您的第一个选项缺少一个右括号

不过,承诺确实很简洁,因为你可以做这样的事情

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
                                            }
                }
使用这个库!它使用请求做承诺变得非常容易

,您也可以在bluebird中执行此操作,bluebird是所有promise库中我最喜欢的,但它稍微复杂一些

编辑:

因为有人发表文章说这是离题的,而事实并非如此。我将进一步深入探讨为什么这不能按您认为的方式工作。这不能正常工作的原因之一是Node.JS是异步的

这意味着您的代码在运行第二个请求之前没有等待第一个请求完成,因此在下一个请求需要令牌之前,您实际上没有获得令牌

解决这一问题的方法之一是使用我最初说过的承诺。有很多库强制同步。例如:

还有更多


您可以将其进一步抽象,并从第二个请求调用第一个请求,以获取API密钥并存储它。

答案与主题无关。请将此作为注释保留。我的答案非常好,但我添加了它。答案与主题无关。请将此作为注释保留。我的答案非常好不,但我加了一点。