Подтвердить что ты не робот

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

Я искал по всему 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;
};
4b9b3361

Ответ 1

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 видеть консоль .js

Ответ 2

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

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

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

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

Ответ 3

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

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

Это сработало для меня.

Ответ 4

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

  • 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' },
    ...
]

Ответ 5

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

Как это

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

Ответ 6

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

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

Ответ 7

В process.env есть свойство INIT_CWD. Это то, с чем я сейчас работаю в своем проекте.

const {INIT_CWD} = process.env;
const paths = require('${INIT_CWD}/config/paths');

Удачи...