0

我有一项服务可以下载“N”张图像并将它们添加到 .zip 文件中。

使用 10,000 张图像可以正常工作,但如果超过 20,000 张,它会向我发送以下错误:

我正在使用https://www.npmjs.com/package/archiver。这发生在具有 node v 14 和 node-archiver 0.11.0 的 EBS 的生产环境中

internal/buffer.js:71
    throw new ERR_OUT_OF_RANGE('value', range, value);
    ^

RangeError [ERR_OUT_OF_RANGE]: The value of "value" is out of range. It must be >= 0 and <= 4294967295. Received 4_301_612_586
    at new NodeError (internal/errors.js:322:7)
    at checkInt (internal/buffer.js:71:11)
    at writeU_Int32LE (internal/buffer.js:691:3)
    at Buffer.writeUInt32LE (internal/buffer.js:704:10)
    at Object.util.getLongBytes (/app/node_modules/compress-commons/lib/archivers/zip/util.js:60:7)
    at module.exports.ZipArchiveOutputStream._writeCentralFileHeader (/app/node_modules/compress-commons/lib/archivers/zip/zip-archive-output-stream.js:233:22)
    at module.exports.<anonymous> (/app/node_modules/compress-commons/lib/archivers/zip/zip-archive-output-stream.js:99:10)
    at Array.forEach (<anonymous>)
    at module.exports.ZipArchiveOutputStream._finish (/app/node_modules/compress-commons/lib/archivers/zip/zip-archive-output-stream.js:98:17)
    at module.exports.ArchiveOutputStream.finish (/app/node_modules/compress-commons/lib/archivers/archive-output-stream.js:100:8)
    at module.exports.ZipStream.finalize (/app/node_modules/zip-stream/lib/zip-stream.js:109:8)
    at module.exports.Zip.finalize (/app/node_modules/archiver/lib/modules/zip/index.js:30:15)
    at module.exports.Archiver._moduleFinalize (/app/node_modules/archiver/lib/modules/core/index.js:64:18)
    at module.exports.Archiver._onQueueDrain (/app/node_modules/archiver/lib/modules/core/index.js:128:10)
    at next (/app/node_modules/async/lib/async.js:801:31)
    at /app/node_modules/async/lib/async.js:32:16 {
  code: 'ERR_OUT_OF_RANGE'
}

服务:

async generateZip(): Promise < any > {
    await new Promise< any >(async (resolve, reject) => {
        const zipStream = fs.createWriteStream('zip_file.zip')
        zipStream.on('error', reject)

        const archive = archiver('zip', {
            zlib: {
                level: 9
            },
        })

        archive.on('error', (err: any) => {
            throw new Error(err)
        })

        archive.pipe(zipStream)

        const medias = [{
            url: 'image.jpg'
        }, {
            url: 'image.jpg'
        }, ...]

        for (const media of medias) {
            archive.append(this.getStream(media.url), {
                name: media.url
            })
        }

        zipStream.on('close', async () => {
            console.log('done')
            resolve()
        })

        archive.finalize()

    }).catch((err) => {
        throw new Error(err)
    })
}

getStream = (key: string) => {
    let streamCreated = false
    const passThroughStream = new stream.PassThrough()

    passThroughStream.on('newListener', (event) => {
        if (!streamCreated && event == 'data') {
            const s3Stream = this.awsService.getFile(key) // s3.getObject(params).createReadStream()

            s3Stream
                .on('error', (err) => {
                    console.log(err)
                    passThroughStream.emit('error', err)
                })
                .pipe(passThroughStream)

            streamCreated = true
        }
    })

    return passThroughStream
}
4

0 回答 0