Подпишитесь на долгую обработку отзыва на сервер NodeJS от клиента - PullRequest
0 голосов
/ 31 октября 2019

Я создал сервер Node JS, который выполняет следующие действия:

  1. Загружает файлы мультимедиа (видео и изображения) на сервер, используя multer
  2. Если носитель является изображением,затем измените его размер, используя
  3. Если носитель является видео, затем измените его размер и сожмите его, используя fluent-ffmpeg
  4. Загрузите файлы в хранилище Firebase для резервного копирования

Всеэто работает, знаю бегло. Проблема в том, что, когда размер загружаемого файла велик, обработка запроса занимает много времени. Поэтому я хочу показать некоторый прогресс на стороне клиента, как показано ниже:

  • Состояние 1. Загрузка мультимедиа -> n%
  • Состояние 2. Загрузка мультимедиа
  • Состояние 3. Медиа загружается в облако -> n%
  • Состояние 4. Результат -> JSON = {status: "ok", uri: .., cloudURI: .., ..}

API хранилища Firebase имеет такую ​​функциональность при создании задачи загрузки, как показано ниже:

let uploadTask = imageRef.put(blob, { contentType: mime });
uploadTask.on('state_changed', (snapshot) => {
  if (typeof snapshot.bytesTransferred == "number") {
    let progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    console.log('Upload is ' + progress + '% done');
  }
});

Я обнаружил, что это можно реализовать с помощью веб-сокетов,Мне интересно, есть ли другие способы сделать это.

Проблема описана также здесь: http://www.tugberkugurlu.com/archive/long-running-asynchronous-operations-displaying-their-events-and-progress-on-clients

И есть один из методов Доступ к частичному ответу с помощью AJAX или WebSockets? но я смотрюдля более гибкого и профессионального решения.

1 Ответ

0 голосов
/ 05 ноября 2019

Я решил эту проблему с помощью подписок GraphQL. Тот же подход может быть реализован с использованием WebSockets. Чтобы решить эту проблему, выполните следующие действия:

  1. Отправка файлов на сервер загрузки

  2. Создание уникального идентификатора операции и отправка его в ответ на запрос. клиент

Пример: response = {op: "A78HNDGS89NSNBDV7826HDJ"}

Создать подписку по opID

Например: subscription { uploadStatus(op: "A78HNDGS89NSNBDV7826HDJ") { status }}

Каждый раз при изменении статуса отправляйте запрос конечной точке GraphQL, которая публикует данные в pubsub. Для отправки запроса GraphQL с сервера nodejs вы можете использовать https://github.com/prisma-labs/graphql-request

Пример:

const { request } = require('graphql-request');
const GQL_URL = "YOUR_GQL_ENDPOINT";
const query = `query {
    notify ("Status text goes here")
}`

request(GQL_URL, query).then(data =>
  console.log(data)
)

Функция решателя уведомлений публикует данные в pubsub

 context.pubsub.publish('uploadStatus', {
     status: "Status text"
 });

Если у вас более сложная архитектура, вы можете использовать брокеры сообщений, такие как RabbitMQ, Kafka и т. Д.

Если кто-то знает другие решения, сообщите нам)

...