【问题标题】:NodeJS... Saving JSON to a VariableNodeJS ... 将 JSON 保存到变量中
【发布时间】:2015-06-18 03:18:56
【问题描述】:

我是 NodeJS 的新手,但我环顾四周,似乎无法在下面找到解决问题的方法。我确信这很简单,但提前感谢您提供的所有帮助!

我正在尝试通过 NodeJS 制作一个简单的 JSON 抓取工具。我所需要的只是将 JSON 存储到一个变量中。问题是,我正在使用 Require,他们的示例只是将其记录到控制台。我已经尝试在它登录到控制台后添加一个变量,但我只是变得不确定。下面是我的代码,到目前为止它非常简单:)

//  var jsonVariable; Doesn't work, shown as a test
function getJSON(url){
    var request = require("request")

    request({
    url: url,
    json: true
}, function (error, response, body) {

    if (!error && response.statusCode === 200) {
        console.log(body) // Print the json response
        //return body;  This doesn't work, nor does making a global variable called json and assigning it here. Any ideas?
        //jsonVariable = body; // This also doesn't work, returning undefined even after I've called the function with valid JSON
    }
})
}

再次感谢您给我的任何帮助:)

【问题讨论】:

  • 当您 return body 时,您将其返回到 function (error, response, body) 回调,而不是实际返回到 getJSON 函数
  • 我不明白,json 是在一个变量中,body。如果您在其他地方需要,请添加回调。
  • jsonVariable = body 有效。但它是在您调用该函数后的某个时间设置的。为了证明它有效,在将来的某个时间使用setTimeout 检查jsonVariable 的值。这意味着你永远,永远,永远,永远(我怎么强调都不为过),永远从异步函数返回一个值。相反,您需要做的是将回调传递给 receive 值。

标签: javascript json node.js require


【解决方案1】:

问题在于request 方法是异步的,但您尝试同步返回结果。您需要发出一个同步请求(使用您正在使用的 request 包似乎不可能),或者传递一个回调函数以在请求成功响应时调用。例如:

var request = require("request")

function getJSON(url, callback) {
  request({
    url: url,
    json: true
  }, function (error, response, body) {
    if (!error && response.statusCode === 200) {
      callback(body);
    }
  });
}

getJSON('http://example.com/foo.json', function (body) {
  console.log('we have the body!', body);
});

【讨论】:

    【解决方案2】:

    如果你使用'return body',它会返回到哪里?该函数作为 request() 函数的参数被调用。您也不能在匿名函数中定义变量,因为您无法在该范围之外访问它。

    您需要做的是在function getJSON() 之外定义一个变量,然后将正文保存到该变量中。

    例如,

    var result;
    
    function getJSON(url){
      var request = require("request")
    
      request({
        url: url,
        json: true
        }, function (error, response, body) {
          if (!error && response.statusCode === 200) {
            result = body; 
          }
      });
    }
    

    【讨论】:

    • 更好的是,他可以将回调函数作为getJSON 函数的参数,并在请求成功时调用它,否则他将永远不知道何时设置了全局主体变量,即何时设置请求完成
    • 这是个好主意,或者他也可以将他的输出命名为某个对象。如果他在抓取,他可能会得到相当多的数据。虽然不知道他还想做什么,但很难准确地说出。副作用和全局变量是不好的做法,所以我的方法肯定可以改进。
    • 这对我不起作用:(我想回调是个好主意。我假设这个函数会在我们将结果分配给正文的地方被调用,对吗?
    • 编辑:我很抱歉含糊其辞 - 即使在调用此函数后,它仍返回未定义。
    • 查看 Matt Huggins 的回答,它使用回调是更好的做法。至于为什么这不起作用,我不明白为什么它不起作用...如果您保持 console.log 登录,它仍然会触发,对吗?附加到请求的函数本身就是一个在收到响应时触发的回调。保持登录并确保它触发。 (也许状态码是关闭的?)
    猜你喜欢
    • 2015-05-21
    • 2012-04-13
    • 2019-12-25
    • 2019-07-24
    • 1970-01-01
    • 2019-08-25
    • 2018-11-29
    • 1970-01-01
    • 2022-09-24
    相关资源
    最近更新 更多