NodeJS ...将JSON保存到一个变量

问题描述:

我对NodeJS有点新手,但我环顾四周,似乎无法找到解决我下面的问题的解决方案。我确信这很简单,但在此先感谢您给我的所有帮助!NodeJS ...将JSON保存到一个变量

我想通过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 
    } 
}) 
} 

再次感谢这么多的帮助。如果你用“回体”,其中它返回到你能给我:)

+0

当你'返回body',你将其返回到'功能(错误,响应体)'回调,而不是实际的'getJSON'功能 – squill25

+0

我不明白这一点,在json是一个变量,'body'。如果你需要在其他地方添加回调。 – dandavis

+0

'jsonVariable = body'工作。但是在你调用函数之后,它会在将来的某个时间点被设置。为了证明它的工作原理,在以后的某个时间使用'setTimeout'检查'jsonVariable'的值。这意味着你永远永远永远不会受到压力(我无法强调它),永远不会从异步函数中返回一个值。您需要做的是将回调传递给**接收**值。 – slebetman

的问题是,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); 
}); 

?该函数被调用为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; 
     } 
    }); 
} 
+1

更好的是,他可以有一个回调函数作为'getJSON'函数的参数,并在请求成功时调用它,否则他永远不会知道何时设置全局主体变量,即何时完成请求 – squill25

+1

这是一件好事的想法,或者他可以将他的输出命名空间到一个对象的地方。如果他在刮,他可以想象得到相当数量的数据。 虽然不知道他还想做什么,但很难说清楚。副作用和全局变量是不好的做法,所以我的方法肯定可以改进。 – ChadF

+0

这不适用于我:(我想回调将是一个好主意,我认为这个函数将被称为正确的地方,我们将结果分配给正文,正确吗? –