javascript - Amazon S3 - Proslijedi niz za učitavanje više nizova na S3 kantu u nodejs


Recimo da imam jednostavnu petlju ovako:

    for (const i=0;i<3;i++) {
        to(`This counter is ${i}`)
    }

Želim imati na kraju u svojoj datoteci:

  • Ovaj brojač je 0
  • Ovaj brojač je 1
  • Ovaj brojač je 2

Pokušao sam to učiniti tako da napravim ovo:

    export class S3Output extends Output {
      #stream: Readable | null = null
      async to(s: string): Promise<void> {
        const params = {
          Bucket: config.aws.bucketName,
          Body: this.#stream,
          Key: 'test.json'
        }
        this.#stream?.pipe(process.stdout)
        this.#stream?.push(s)
        await S3.upload(params).promise()
        return
      }
    
      init(): void {
        this.#stream = new Readable()
        this.#stream._read = function () {};
      }
    
      finish(): void {
        this.#stream?.push(null)
        return
      }
    }

Moja init funkcija se poziva na početku petlje, moja to funkcija se poziva svaki put kad želim dodati niz u datoteku, a finish funkcija na kraju petlje. Ovaj kod ne dodaje nikakve podatke, zašto?

Odgovor #1

Zapravo sam otkrio u čemu je bio problem. Trebao sam poslati stream kad je gotov, a ne dok sam ga radio. Također, nema potrebe za pipe.

export class S3Output extends Output {
  #stream: Readable | null = null
  async to(s: string): Promise<void> {
    this.#stream?.push(s)
    return
  }

  init(): void {
    this.#stream = new Readable()
    this.#stream._read = function () {}
  }

  async finish(): Promise<void> {
    this.#stream?.push(null)
    const params = {
      Bucket: config.aws.bucketName,
      Body: this.#stream,
      Key: 'test.json'
    }
    await S3.upload(params).promise()
    return
  }
}