Загрузка файла поставщика gdrive петлевой компоненты-хранилища stream.push () после EOF - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь создать провайдера Google Drive для loopback-component-storage.Ожидается, что метод закачки провайдера обратной связи возвратит доступный для записи поток, но API-интерфейс устройства google ожидает ожидаемый для загрузки поток для чтения.

Только читаемый поток может передавать в поток для записи, но не наоборот.

Я попытался с помощью while2, который должен просто проксировать все данные, но он ведет себя как поток Шредингера: иногда он работает, а иногда нет, когда я смотрю на него, слушая события, он работает.Когда это терпит неудачу, это бросает steam.push() after EOF.

const {google} = require('googleapis');
const through = require('through2');
...
const drive = google.drive({
  version: 'v3'
});
...
upload(options) {
  const containerName = options.container;
  const fileName = options.remote;

  const proxyStream = through();

  this.findContainerByName(containerName, (err, container) => {
    const media = {
      body: proxyStream,
      mimeType: options.contentType,
    };

    const fileMetaData = {
      name: fileName,
      parents: [container.id],
    };

    drive.files.create({
      resource: fileMetaData,
      media,
    });
  });

  return proxyStream;
}

Это похоже на проблему синхронизации, вызванную асинхронной findContainerByName -функцией.Из-за того, как работает петлевой API, мне нужно спросить у API диска идентификатор контейнера, который указан по имени.Я кэширую ответы, но в первый раз это также должно работать.

Могу ли я как-то задержать возврат ответа потока или мне нужно два потока, чтобы иметь возможность буферизовать поток для записи до тех пор, пока поток не станет читаемым?готовы?

...