Я новичок в Node и пытаюсь запросить некоторые данные json с сервера и сохранить в файл. Я могу получить данные без проблем, но не могу понять, как писать в файл после получения всех данных. Нужен ли мне обратный вызов или мне нужно использовать http.CreateServer()? Любая помощь с этим будет оценена по достоинству.
Это то, что у меня есть до сих пор:
"use strict";
const request = require('request');
const fs = require('fs');
var options = {
url: 'url-to-request-data',
method: 'GET',
accept: 'application/json',
json: true,}
};
// Start the request
request(options, function(error, response, body) {
if (error) {
return console.log(error);
} else {
var path = "~/jsonfile.json";
fs.writeFile(path, body);
}
});
Данные json довольно велики, так что
fs.writeFileSync
- лучший способ пойти? - ozzyzig
Нет. Вы должны создать Writable Stream для больших файлов, таким образом, вы только буферизуете куски данных одновременно в памяти, а не весь файл одновременно. request()
возвращает объект, реализующий интерфейс Stream
, поэтому вы можете просто .pipe()
его в fs.createWriteStream()
:
'use strict';
const request = require('request');
const fs = require('fs');
var options = {
url: 'url-to-request-data',
method: 'GET',
accept: 'application/json',
// json: true,
};
var path = '~/jsonfile.json';
var ws = fs.createWriteStream(path);
// Start the request
request(options).on('error', function (error) {
console.log(error);
}).on('close', function () {
console.log('Done');
}).pipe(ws);
У вас есть несколько вопросов.
fs.writeFile
принимает третий аргумент, функцию обратного вызова, где он уведомит вас о любой ошибке, которую вы получаете.
fs.writeFile(path, body, err => console.error(err));
В системах * nix с этим файловым пути вы получите сообщение об Error: ENOENT: no such file or directory
~
- расширение bash, узел не знает, что с ним делать.
использовать:
const os = require('os');
const path = require('path');
const filePath = path.join(os.homedir(), 'jsonfile.json');
fs.writeFile(path, body, err => console.error(err));
Затем вы получите [Object object]
записанный в ~/jsonfile.json
если этот URL-адрес возвращает json
поскольку вы явно запрашиваете его.
У вас есть решения:
json: true
fs.writeFile(path, JSON.stringify(body), err =>/*... */)
Если вы пишете только файл, лучший способ - использовать streams
const filePath = path.join(os.homedir(), 'jsonfile.json');
request(options).pipe(fs.createWriteStream(filePath));
// See link for error handling
Вы можете больше узнать о request
и потоках и о том, как обрабатывать ошибки здесь
json: true
, я не заметил этого, пока не увидел упомянутое в вашем ответе. Я изменил это в моем соответственно.