2014-02-24 109 views
34

我已經在此搜索了所有的stackoverflow/google,但似乎找不到它。使用Node.js將對象寫入文件

我在抓取給定URL頁面的社交媒體鏈接,該函數返回一個包含URL列表的對象。

當我嘗試把這些數據寫入到不同的文件,將其輸出到該文件作爲[object Object]而不是預期的: [「https://twitter.com/#!/101Cookbooks」, 「http://www.facebook.com/101cookbooks」] 作爲它,當我console.log()結果一樣。

這是我的傷心試圖讀取和寫入節點文件,試圖讀取通過函數調用request(line, gotHTML)每一行(網址),並輸入:

fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){ 
    console.log(line); 
    var obj = request(line, gotHTML); 
    console.log(obj); 
    fs.writeFileSync('./data.json', obj , 'utf-8'); 
}); 

參考 - 在gotHTML功能:

function gotHTML(err, resp, html){ 
    var social_ids = []; 

if(err){ 
     return console.log(err); 
    } else if (resp.statusCode === 200) { 
     var parsedHTML = $.load(html); 


     parsedHTML('a').map(function(i, link){ 
      var href = $(link).attr('href'); 
      for(var i=0; i<socialurls.length; i++){ 
       if(socialurls[i].test(href) && social_ids.indexOf(href) < 0) { 
        social_ids.push(href); 
       }; 
      }; 
     }) 
    }; 

    return social_ids; 

}; 
+2

'[對象的對象]'是一個對象'toString'。如果你想要對象的表示,使用'JSON.stringify'。 – elclanrs

+2

請注意'JSON.stringify'。對於數組,您是安全的,但是當對象具有循環引用時,它將失敗([請參閱本主題](http://stackoverflow.com/a/11616993/151445))。 'util'模塊處理循環引用。 –

回答

36

obj是你的例子中的一個數組。

fs.writeFileSync(filename,data,[options])要求數據參數中的StringBuffersee docs

嘗試寫一個字符串格式的數組:

// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks' 
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8'); 

或者:

// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'] 
var util = require('util'); 
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8'); 

編輯:你看到的原因,您的示例陣列是因爲節點的實施console.log不只需撥打toString,即可撥打util.formatsee console.js source

+1

真棒...很好的幫助...謝謝:) – Sohail

+1

如果你的對象包含大型數組,這將不會工作,因爲檢查方法會輸出類似「45000 more ...]」 – Coxer

10

如果您正在創建[object object] t母雞使用JSON.stringify

fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');

它爲我工作。

39

建立在什麼deb2fast說我也將通過在一些額外的參數JSON.stringify()得到它的漂亮格式:

fs.writeFile('./data.json', JSON.stringify(obj, null, 2) , 'utf-8'); 

第二個參數是一個可選的替代品功能,你不在這種情況下不需要如此null的作品。

第三個參數是用於縮進的空格數量。 2和4似乎是流行的選擇。

+0

它會導致循環依賴問題。雙向依賴關係無法轉換爲JSON。 –

3

根據我的經驗,JSON.stringify比util.inspect稍快。 我不得不將DB2查詢的結果對象保存爲json文件,查詢返回了92k行對象,轉換花費很長時間才能完成util.inspect,所以我通過編寫相同的1000條記錄用兩種方法對象到一個文件。

  1. JSON。字符串化

    fs.writeFile('./data.json', JSON.stringify(obj, null, 2)); 
    

時間:3:57(3分鐘57秒)

結果的格式:

[ 
    { 
    "PROB": "00001", 
    "BO": "AXZ", 
    "CNTRY": "649" 
    }, 
    ... 
] 
  • util.inspect

    var util = require('util'); 
    fs.writeFile('./data.json', util.inspect(obj, false, 2, false)); 
    
  • 時間4:12(4分12秒)

    結果的格式:

    [ { PROB: '00001', 
        BO: 'AXZ', 
        CNTRY: '649' }, 
        ... 
    ]