2015-04-12 101 views
1

我對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

回答

4

的問題是,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); 
}); 
0

?該函數被調用爲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

這不適用於我:(我想回調將是一個好主意,我認爲這個函數將被稱爲正確的地方,我們將結果分配給正文,正確嗎? –