2014-02-24 69 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' }, 
        ... 
    ]