我是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
答案 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进行异步操作。