Работа с большими файлами данных может быть сложной задачей и вызвать узкое место в вашем приложении. Мы не можем просто загрузить файл сразу и ожидать, что все будет работать. Нам нужно перебирать данные и анализировать их по частям.

Предварительные условия

В этом проекте мы будем использовать Узел, Гиперквест и Поток JSON для извлечения файла с удаленного URL-адреса, его анализа и обработки полученных данных.

В этой статье предполагается, что вы знаете основы работы с node.

Для начала откройте рабочий каталог в редакторе кода и создайте новый файл с именем parser.js в корне.

Получение JSON

Чтобы иметь возможность работать, нам нужно будет получить нужные данные с удаленного сервера. Если вы хотите проверить это с помощью файла JSON, я рекомендую использовать Конечную точку Scyfall JSON для данных по всей Magic! Карты сбора.

Прежде чем мы сможем начать установку, вам необходимо настроить package.json для установки наших пакетов NPM. Вы можете сделать это с помощью Yarn или NPM.

yarn # or npm install

Далее нам нужно будет установить гиперквест.

yarn add hyperquest

Hyperquest - это подмножество request, написанное для обработки больших объемов данных без нарушения работы нашего сервера. Он работает, исправляя множество проблем с HTTP, так что никакие надоедливые ошибки не мешают.

Давайте настроим это в верхней части parser.js гиперквеста импорта файла.

const hyperquest = require('hyperquest');

Затем создайте новую функцию, в которой будет размещена наша логика. Пока мы здесь, установите переменную для URL-адреса в расположение файла JSON.

const parser = async () => {
  const url = 'https://site.com/linktoyour.json';
};

Затем давайте инициализируем hyperquest для извлечения данных, чтобы мы могли передать их нашим последующим функциям. Здесь мы используем await, чтобы гарантировать, что все будет обработано, прежде чем двигаться дальше.

const parser = async () => {
  const url = 'https://site.com/linktoyour.json';

  await hyperquest(url);
}

Hyperquest позволяет вам создать конвейер, чтобы вы могли передавать полученные данные другим функциям, добавляя .pipe(func), мы собираемся использовать это на следующем шаге.

Обработка возвращенных данных

Мы собираемся использовать еще несколько пакетов для обработки возвращаемых данных и обеспечения их правильной обработки. Эти:

  1. JSONStream - что позволяет нам передавать анализ возвращенных результатов в потоковом режиме.
  2. Event-stream - что позволяет нам обрабатывать проанализированные данные.

Установите их в проект.

yarn add JSONStream event-stream

Импортируйте их в начало файла parser.js.

const JSONStream = require('JSONStream');
const es = require('event-stream');

Первая конвейерная функция, которую мы добавим, предназначена для JSONStream. Это гарантирует, что все будет возвращено правильно в удобочитаемом формате. Обновите наш код следующим образом.

await hyperquest(url)
  .pipe(JSONStream.parse('*'));

*, переданный функции parse, сообщает пакету JSONStream, что я хочу вернуть каждую строку в моем файле JSON. Если бы все ваши записи содержались внутри объекта data. Вы можете изменить код на значение, близкое к JSONStream.parse('data.*').

Затем добавьте конвейер для обработки данных с помощью event-stream, обновите код, добавив следующий .pipe().

await hyperquest(url)
  .pipe(JSONStream.parse('*'))
  .pipe(es.map(async (data, callback) => {
    console.log(data);
    callback(null, data);
  }))

Чтобы объяснить, что у нас есть на данный момент, для каждой строки, которую мы возвращаем с помощью JSONStream, она будет передана в функцию потока событий и console.log данные (исключительно для проверки работоспособности). Наконец, мы вызываем функцию callback(), которая отбрасывает текущие данные и возвращает запись данных без текущей записи, чтобы мы могли вернуться в цикл.

Наш полный код должен выглядеть следующим образом:

const hyperquest = require('hyperquest')
const JSONStream = require('JSONStream');
const es = require('event-stream');

const parser = async () => {
  await hyperquest(url)
    .pipe(JSONStream.parse('*'))
    .pipe(es.map(async (data, callback) => {
      console.log(data);
      callback(null, data);
    }))
}

parser()

Мы не будем вдаваться в обработку данных, поскольку это можно сделать множеством способов, но если вы запустите node parser.js, вы должны начать видеть записи в консоли.

Я добавил урезанный пример проекта на GitHub.

Надеюсь, это поможет вам в будущем.

Первоначально опубликовано на https://jackwhiting.co.uk.