使用Node.js将对象写入文件

时间:2014-02-24 00:10:16

标签: javascript node.js file-io

我已经在stackoverflow / google上搜索了这个,但似乎无法弄明白。

我正在抓取给定网址页面的社交媒体链接,该函数返回一个包含网址列表的对象。

当我尝试将此数据写入另一个文件时,它会以[object Object]而不是预期的方式输出到文件:     [' https://twitter.com/#!/101Cookbooks',     ' http://www.facebook.com/101cookbooks'] 就像我console.log()结果一样。

这是我在Node中读取和写入文件的不幸尝试,尝试读取每一行(url)并通过函数调用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;
};

7 个答案:

答案 0 :(得分:70)

在deb2fast所说的基础上,我还会将一些额外的参数传递给JSON.stringify(),以使其格式相同:

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

第二个参数是一个可选的替换函数,在这种情况下您不需要null。{/ p>

第三个参数是用于缩进的空格数。 2和4似乎是受欢迎的选择。

答案 1 :(得分:53)

obj是您示例中的数组。

fs.writeFileSync(文件名,数据,[选项])需要数据参数中的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.format see console.js source

答案 2 :(得分:15)

如果您正在考虑[object object],请使用JSON.stringify

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

它对我有用。

答案 3 :(得分:9)

根据我的经验,JSON.stringify比util.inspect稍快。 我不得不将DB2查询的结果对象保存为json文件,查询返回了92k行的对象,转换需要很长时间才能完成util.inspect,所以我通过编写相同的1000记录对象进行了以下测试使用这两种方法的文件。

  1. JSON.Stringify

    fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
    
  2. 时间:3:57(3分57秒)

    结果格式:

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

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

      结果格式:

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

答案 4 :(得分:2)

进一步了解@Jim Schubert@deb2fast的回答:

为了能够写出大于 objects 的大 ~100 MB 订单,您需要使用 for...of 如下所示并符合您的要求。

const fsPromises = require('fs').promises;

const sampleData = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};

const writeToFile = async () => {
  for (const dataObject of Object.keys(sampleData)) {
      console.log(sampleData[dataObject]);
      await fsPromises.appendFile( "out.json" , dataObject +": "+ JSON.stringify(sampleData[dataObject]));
  }
}

writeToFile();

有关 node.js 限制的完整参考,请参阅 https://stackoverflow.com/a/67699911/3152654

答案 5 :(得分:1)

您可以尝试执行JSON.stringify(obj);

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

答案 6 :(得分:0)

以防万一其他人偶然发现此问题,我在节点中使用了fs-extra库并将javascript对象写入这样的文件中:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile);