2016-11-18 4 views
0

У меня есть функция fetchXML, которая, предположительно, должна записать XML-файл в мой корневой каталог с именем feed.xml, а затем я хочу console.log данные внутри feed.xml. Я использую fs.readFile И я указываю кодировку с помощью «utf-8», как показано в этом вопросе: Why does Node.js' fs.readFile() return a buffer instead of string?Почему мой fs.readFile возвращает буфер вместо XML?

Но все же результат моего console.log - это буфер. Я проверил внутри feed.xml и действительно содержит xml.

var out = fs.createWriteStream('./feed.xml'); 

var fetchXML = function() { 
    var feedURL = 'http://www2.jobs2careers.com/feed.php?id=1237-2595&c=1&pass=HeahE0W1ecAkkF0l'; 
    var stream = request(feedURL).pipe(zlib.createGunzip()).pipe(out); 

    stream.on('finish', function() { 
    fs.readFile('./feed.xml', 'utf-8', function(err, data) { 
     console.log(data); 
    }); 
    }); 
} 

fetchXML(); 
+0

какая версия узла? – mscdex

+0

Последняя для экспериментальных функций. 7.1 – Mjuice

+0

Я предполагаю, что ошибка, возвращаемая из readFile, равна нулю? Кроме того, правильно ли выводится вывод (кроме буфера вместо строки)? –

ответ

1

Основной проблемой здесь является то, что err устанавливается в этом случае, и он скажет вам, что toString() не удалось (из-за размера файла). Затем он оставляет данные, которые он считывает как буфер, и передает это как второй аргумент для обратного вызова.

Это может быть воспринято как частичное ошибка, так как большинство людей, вероятно, не было бы ожидать, чтобы увидеть второй аргумент, переданный в, но в то же время errявляется множество (и вы всегда должны обрабатывать ошибки) и делает дают вам возможность сделать что-то еще с (необработанными двоичными) данными, которые уже были прочитаны в памяти.

Что касается решений, вы, вероятно, захотите потокового анализатора для больших объемов данных, подобных этому (сотни мегабайт). Для XML один из таких модулей, который обеспечивает потоковый интерфейс, - node-expat.

+0

Я хотел бы взять xml и преобразовать его в JSON с xml2js, но когда я попробую, что с «данными» он возвращает undefined вместо JSON. Я думал, что это может иметь какое-то отношение к этому, возвращая буфер. – Mjuice

+0

Вы хотите использовать потоковый анализатор для очень больших документов, как я уже отметил в своем ответе. – mscdex

+0

Что именно я пытаюсь выполнить с помощью потокового анализатора? Я немного смущен, почему мое текущее решение не работает, чтобы быть честным. Я никогда раньше ничего подобного не делал, поэтому вам придется вернуться к основному объяснению. – Mjuice

Смежные вопросы