从Node.js中的网页检索内容

时间:2017-08-19 19:47:28

标签: node.js npm request

我无疑是node.js的总菜鸟。我正在尝试做一些看似简单但似乎不起作用的事情。我正在使用请求npm模块从网页中检索内容。我想稍后在程序中使用该内容,但似乎没有办法返回从请求中检索的数据或将其作为字符串存储在变量中,因为该变量将在以后的程序中超出范围。

如下所示,我正在向网页发出请求。 URL只是一堆文本,但我计划将其解析为JSON数据,以便稍后用于初始化对象。对象初始化需要一个字符串作为其输入。但我不知道如何在请求中的函数请求范围之外使用该数据。

非常感谢任何指导。

var request = require('request');
stateString = '';


function getState() {

request('http://content.warframe.com/dynamic/worldState.php', function (error, response, body) {
        stateString = body;
    });   
}

getState();
console.log(stateString);

1 个答案:

答案 0 :(得分:0)

正如OwChallie在评论中提到的,请求是异步发送的。换句话说,console.log在请求完成之前执行。

您可以通过将回调传递到getState()函数或查看Promises来解决此问题。对于一个基本的例子,一个回调用就好了。但是,一旦代码中的逻辑变得更加复杂,我强烈建议您查看Promises以使代码易于管理。

示例:

var request = require('request');

var url = "http://content.warframe.com/dynamic/worldState.php";

function getStateUsingCallback(callback) {
  request(url, function (error, response, body) {
    callback(body);
  });
}

function getStateUsingPromise() {
  return new Promise(function (resolve, reject) {
    request(url, function (error, response, body) {
      if (error) return reject(error);

      return resolve(body);
    });
  })
}

// Option 1: Using a callback
getStateUsingCallback(function(body) {
   console.log(body);
});

// Option 2: Using a Promise
getStateUsingPromise()
  .then(function (body) {
    console.log(body);
  })
  .catch(function (error) {
    console.error(error);
  });

或者,您可以强制请求同步运行。因此在运行最后一行之前完全执行该函数。但是,我强烈建议您开始编写和处理异步代码,因为这是Node.js的强大之处!