首页 > 解决方案 > NodeJS 流(管道)数据到 Gcloud 存储

问题描述

我正在将结果从 API 流式传输到 gcloud。

它看起来像这样。

import {pipeline} from 'stream/promises';
import {Storage} from '@google-cloud/storage';
import {getData} from './data';
import {transformData} from './transform';


const datasets = await getDatasets()
for (const dataset of datasets) {
   await pipeline(
       getData({
         data:dataset
       }),
        transformData(),
        GCStream(dataset)
    )
}

getData


export function getData(opts:any) {
  return {
  [Symbol.asyncIterator]() {
    return{
      async next() {
          try {
            const res = await axios.get(
              'endpoint'
            )
            const data = res.data.result
            if (!data.length) return {done: true}
            return  {done: false, value: data}
          } catch (err) {
              console.log(err);
          }
          await delay(10)
        }
        throw new Error(`Failed to fetch.`)
      }
    }
  }
}
}

来自 API 请求的 Promise 的异步迭代器。由于某种原因,它只返回第一个结果。

transformDataReturnsstream.Transform是一个非异步转换流,它从 API 请求迭代器中提取数据并对其进行按摩。

GCStream看起来像这样,我认为这也是一个问题。

const GCStream = (name:string) => {
        const file = destinationBucket.file(name);
       
        async function streamFileUpload(stream:any) {   
            stream.pipe(file.createWriteStream()).on('finish', () => {
                console.log('uploaded')
            });
        }
        return streamFileUpload;  
  }

它只是从 api 流中获得第一个结果,而且它只是停滞不前……从不创建上传。我在处理管道文档时遇到了困难,希望有人能在这里发现明显的错误。

标签: node.jsgoogle-cloud-platformfile-uploadgoogle-cloud-storage

解决方案


推荐阅读