Загрузка через http и потоковая загрузка в хранилище Google Cloud с помощью nodejs - PullRequest
0 голосов
/ 03 января 2019

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

const { Storage } = require('@google-cloud/storage');
const http = require('http');
const storage = new Storage();
const fs = require("fs");
const bucketName = 'BUCKETNAMEHERE';
const blobName = 'image.jpg';
const bucket = storage.bucket(bucketName);
const blob = bucket.file(blobName);

const streamDownload = () => {
    http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg")
        .pipe(blob.createWriteStream({
            metadata: {
                contentType: 'image/jpg'
            }
        }))
        .on("error", (err) => {
            console.error(`error occurred`);
        })
        .on('finish', () => {
            console.info(`success`);
        });
};

На финише никогда не срабатывает. Нет выхода вообще. Я могу без проблем транслировать http.get в локальный файл, так что эта часть выглядит нормально.

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

const streamFs = () => {
    fs.createReadStream('/path/to/mqdefault.jpg')
        .pipe(blob.createWriteStream({
            metadata: {
                contentType: 'image/jpg'
            }
        }))
        .on("error", (err) => {
            console.error(`error occurred`);
        })
        .on('finish', () => {
            console.info(`success`);
        });
};

Второй фрагмент регистрирует «успех», и файл присутствует в корзине.

И http.get, и fs.createReadStream создают поток чтения.

Что я здесь не так делаю?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

библиотека запросов работает с обещаниями, тогда как для http lib требуется обратный вызов:

const streamDownload = () => {

  var stream = blob.createWriteStream({
    metadata: {
        contentType: 'image/jpg'
    }
  })

  http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(res){
        stream.on("error", (err) => {
            console.error(`error occurred`);
        })
        stream.on('finish', () => {
            console.info(`success`);
        });
        res.pipe(stream)            
    })
}
0 голосов
/ 03 января 2019

Переключение на библиотеку request работает:

const request = require('request');
const streamDownload = () => {
    request.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg")
        .pipe(blob.createWriteStream({
            metadata: {
                contentType: 'image/jpg'
            }
        }))
        .on("error", (err) => {
            console.error(`error occurred`);
        })
        .on('finish', () => {
            console.info(`success`);
        });
};

Все еще не уверены, почему http библиотека не делает.

...