Правильный способ получения данных JSON и записи в файл с помощью Node.js

1

Я новичок в 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);
  }
  });
Теги:

2 ответа

1
Лучший ответ

Данные 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);
  • 0
    Здорово, что работает, спасибо за это
2

У вас есть несколько вопросов.

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 поскольку вы явно запрашиваете его.

У вас есть решения:

  1. Удалить json: true
  2. Или 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 и потоках и о том, как обрабатывать ошибки здесь

  • 1
    Спасибо, что json: true , я не заметил этого, пока не увидел упомянутое в вашем ответе. Я изменил это в моем соответственно.
  • 0
    Спасибо, я просто использовал ~ /, так как я не хотел писать полный путь к файлу
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню