Я пытаюсь создать провайдера 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 диска идентификатор контейнера, который указан по имени.Я кэширую ответы, но в первый раз это также должно работать.
Могу ли я как-то задержать возврат ответа потока или мне нужно два потока, чтобы иметь возможность буферизовать поток для записи до тех пор, пока поток не станет читаемым?готовы?