Nodejs捕获来自API调用的响应

时间:2019-02-08 10:04:53

标签: node.js

我是Node js的新手。我试图调用一个给我URL的API,然后我将使用该URL进行许多操作,例如发送SMS,电子邮件,插入到mySql DB。

当我在请求块内记录URL时,API调用工作正常(请参见用WORKING FINE注释的代码)

但是当我尝试将URL记录在请求块之外时,它不起作用。 (请参见注释为“不工作的罚款”的代码)。我想在这里使用URL做所有事情。

请帮助。谢谢

var body = 
{
 "mobile": Mobile,
 "policy": Policy_number,
 "name": Policy_Holder_Name,
 "docs": Docs_Pending,
 "target": 'mobile'
};
			
var options =
{
 uri: BaseURL,
 method: 'POST',
 headers: header,
 json: body
};
    					
var URL = '';

request(options, function (error, response, body) {
  if (!error && response.statusCode == 200) {
	URL = response.body.url;
	console.log(URL); //WORKING FINE
  }
});

console.log(URL);    //NOT WORKING FINE

3 个答案:

答案 0 :(得分:1)

您的请求是异步的,这就是为什么这件事正在发生的原因,我建议您使用异步瀑布作为参考- https://caolan.github.io/async/docs.html#waterfall

答案 1 :(得分:1)

正如其他人指出的那样,您的问题按代码执行的顺序进行。

对请求的调用声明了一个即时函数(称为lambda函数),该函数仅在收到响应后才会执行。然后执行将一直进行到最后,然后运行该功能。

我已注释了以下代码以尝试进行解释。

/**THIS CODE IS RUN FIRST**/
var body = {
            "mobile": Mobile,
            "policy": Policy_number,
            "name": Policy_Holder_Name,
            "docs": Docs_Pending,
            "target": 'mobile'
            };
var options = {
  uri: BaseURL,
  method: 'POST',
  headers: header,
  json: body
};

var URL = '';

/**DECLARES A FUNCTION BUT IS NOT RUN UNTIL THE REQUEST COMPLETES**/
request(options, function (error, response, body) {
  /**THIS CODE RUNS LAST**/
  if (!error && response.statusCode == 200) {
    URL = response.body.url;
    console.log(URL); //WORKING FINE
  }
});

/**RUNS SECOND - URL IS STILL NOT DEFINED**/
console.log(URL);    //NOT WORKING FINE

如果您想运行一些以后的代码,那么最好的模式可能是将其放入函数中。

request(options, function (error, response, body) {
  /**THIS CODE RUNS LAST**/
  if (!error && response.statusCode == 200) {
    doMoreStuff(response.body.url);
  }
});

function doMoreStuff(URL){
  console.log(URL);
}

答案 2 :(得分:0)

URL的默认值为''

现在发出http请求,如果您将获得响应代码200,则表示您已成功获得响应并且URL不是''

Nodejs本质上是异步工作的,因此console.log(URL);可能在向api发出http请求之前执行,因此它将在控制台中打印' '

  

因此最好在请求的响应中访问变量URL

request(options, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    URL = response.body.url;
    console.log(URL); //WORKING FINE
  }
});

是的,您可以在外部访问URL,但是您需要等到请求完成

例如,等待10秒钟,然后在控制台中打印URL,如下所示:

setTimeout(function(){ console.log(URL)}, 10000);

使用AsyncJS进行异步操作。