Я искал это по всему 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;
};
javascript
node.js
file-io
Сарабким
источник
источник
[object Object]
это объектtoString
. Если вам нужно представление объекта, используйтеJSON.stringify
.JSON.stringify
. С массивами вы в безопасности, но когда на объекты есть циклические ссылки, это не удастся ( см. Этот раздел ).util
Модуль обрабатывает циклические ссылки.Ответы:
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источник
Основываясь на том, что сказал deb2fast, я бы также передал пару дополнительных параметров JSON.stringify (), чтобы привести его в красивый формат:
fs.writeFileSync('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');
Второй параметр - это необязательная функция-заменитель, которая в этом случае вам не нужна, поэтому
null
работает.Третий параметр - это количество пробелов, используемых для отступа. 2 и 4 кажутся популярными.
источник
+ '\n'
к этому вызову stringify () добавить новую строку.Если вы получаете,
[object object]
используйтеJSON.stringify
fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');
У меня это сработало.
источник
По моему опыту, JSON.stringify немного быстрее, чем util.inspect. Мне пришлось сохранить объект результата запроса DB2 как файл json. Запрос вернул объект из 92 тыс. Строк, преобразование заняло очень много времени с помощью util.inspect, поэтому я выполнил следующий тест, написав тот же объект из 1000 записей. в файл обоими методами.
JSON.Stringify
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' }, ... ]
источник
не могли бы вы попробовать сделать JSON.stringify (obj);
Как это
var stringify = JSON.stringify(obj); fs.writeFileSync('./data.json', stringify , 'utf-8');
источник
На случай, если кто-то еще наткнется на это, я использую библиотеку fs-extra в node и записываю объекты javascript в файл, например:
const fse = require('fs-extra'); fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile);
источник