node.js - 通过http下载并使用nodejs流式上传到Google Cloud存储

标签 node.js google-cloud-platform google-cloud-storage

我正在努力下载以直接流式传输到 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.getfs.createReadStream 都创建一个读取流。

我在这里做错了什么?

最佳答案

请求库与 Promise 一起工作,而 http 库需要回调:

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)            
    })
}

关于node.js - 通过http下载并使用nodejs流式上传到Google Cloud存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014305/

相关文章:

kubernetes - Google Kubernetes群集无法自动缩减

hadoop - 如何使用 Airflow 运行 HDFS Copy 命令?

docker - 访问被拒绝将图像推送到 gcr 存储库

terminal - 安装 Google Cloud SDK 时未找到 gcloud 命令

node.js - 在一种情况下使用 if/else 与异步代码

javascript - 是否可以在 PostgreSQL 中使用 knex returning() 方法返回操作表中的所有行

node.js - Webpack 5 重大变更 "process/browser"

google-cloud-platform - 云函数中的 Pub/Sub 与 Http Cron 作业

google-bigquery - 以 CSV 文件格式将数据从 Bigquery 加载到谷歌存储桶

javascript - 在服务器端 express 应用程序中使用 i18n-node