Записывать объекты в файл с помощью Node.js

83

Я искал это по всему stackoverflow / google, но не могу понять.

Я просматриваю ссылки социальных сетей на данной странице URL, и функция возвращает объект со списком URL.

Когда я пытаюсь записать эти данные в другой файл, они выводятся в файл как [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;
};
Сарабким
источник
3
[object Object]это объект toString. Если вам нужно представление объекта, используйте JSON.stringify.
elclanrs
2
Будьте осторожны с JSON.stringify. С массивами вы в безопасности, но когда на объекты есть циклические ссылки, это не удастся ( см. Этот раздел ). utilМодуль обрабатывает циклические ссылки.
Джим Шуберт

Ответы:

71

obj - это массив в вашем примере.

fs.writeFileSync (имя файла, данные, [параметры]) требует либо, Stringлибо Bufferв параметре данных. см. документы .

Попробуйте записать массив в строковом формате:

// 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');

edit: Причина, по которой вы видите массив в своем примере, заключается в том, что реализация node console.logне просто вызывает toString, она вызывает util.format см. источник console.js

Джим Шуберт
источник
5
Если ваш объект содержит большие массивы, это не сработает, так как метод inspect выдаст что-то вроде «еще 45000 ...]»
Коксер
96

Основываясь на том, что сказал deb2fast, я бы также передал пару дополнительных параметров JSON.stringify (), чтобы привести его в красивый формат:

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

Второй параметр - это необязательная функция-заменитель, которая в этом случае вам не нужна, поэтому nullработает.

Третий параметр - это количество пробелов, используемых для отступа. 2 и 4 кажутся популярными.

Парень
источник
это вызовет проблему круговой зависимости. двусторонние зависимости не могут быть преобразованы в JSON.
Озан Эртюрк
В записанном текстовом файле отсутствует символ новой строки в конце файла. Как это исправить?
Friederbluemle
1
@friederbluemle - Вы можете + '\n'к этому вызову stringify () добавить новую строку.
Парень
1
Это сработало лучше всего для меня, потому что использование принятого ответа дало мне неправильный результат.
Аншуман Кумар
20

Если вы получаете, [object object]используйтеJSON.stringify

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

У меня это сработало.

deb2fast
источник
10

По моему опыту, JSON.stringify немного быстрее, чем util.inspect. Мне пришлось сохранить объект результата запроса DB2 как файл json. Запрос вернул объект из 92 тыс. Строк, преобразование заняло очень много времени с помощью util.inspect, поэтому я выполнил следующий тест, написав тот же объект из 1000 записей. в файл обоими методами.

  1. JSON.Stringify

    fs.writeFile('./data.json', JSON.stringify(obj, null, 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));
    

Время: 4:12 (4 мин 12 сек)

Формат результата:

[ { PROB: '00001',
    BO: 'AXZ',
    CNTRY: '649' },
    ...
]
Netsmile
источник
4

не могли бы вы попробовать сделать JSON.stringify (obj);

Как это

 var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8'); 
Наввые Ананд
источник
1

На случай, если кто-то еще наткнется на это, я использую библиотеку fs-extra в node и записываю объекты javascript в файл, например:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 
tljw86
источник