I am trying to write a program to get a zip file from s3, unzip it, and then upload to S3. But I found two exceptions that I cannot catch.
1. StreamContentLengthMismatch: Stream content length mismatch. Received 980323883 of 5770104761 bytes. StreamContentLengthMismatch: Stream content length mismatch. Received 980323883 of 5770104761 bytes. This happens irregularly.
2. NoSuchKey: The specified key does not exist. This happens when I enter the wrong key.
When these two exceptions occur, this program crashes.
I would like to catch and handle these two exceptions correctly.
I want to prevent a crash.
const unzipUpload = () => { return new Promise((resolve, reject) => { let rStream = s3.getObject({Bucket: 'bucket', Key: 'hoge/hoge.zip'}) .createReadStream() .pipe(unzip.Parse()) .on('entry', function (entry) { if(entry.path.match(/__MACOSX/) == null){ // pause if(currentFileCount - uploadedFileCount > 10) rStream.pause() currentFileCount += 1 var fileName = entry.path; let up = entry.pipe(uploadFromStream(s3,fileName)) up.on('uploaded', e => { uploadedFileCount += 1 console.log(currentFileCount, uploadedFileCount) //resume if(currentFileCount - uploadedFileCount <= 10) rStream.resume() if(uploadedFileCount === allFileCount) resolve() entry.autodrain() }).on('error', e => { reject() }) } }).on('error', e => { console.log("unzip error") reject() }).on('finish', e => { allFileCount = currentFileCount }) rStream.on('error', e=> { console.log(e) reject(e) }) }) } function uploadFromStream(s3,fileName) { var pass = new stream.PassThrough(); var params = {Bucket: "bucket", Key: "hoge/unzip/" + fileName, Body: pass}; let request = s3.upload(params, function(err, data) { if(err) pass.emit('error') if(!err) pass.emit('uploaded') }) request.on('httpUploadProgress', progress => { console.log(progress) }) return pass }
This is the library that I use when unpacking. https://github.com/mhr3/unzip-stream
Help me!
source share