AWS NodeJS SDK удалить версионный объект - PullRequest
0 голосов
/ 18 марта 2020

Мне нужно удалить версионный объект на S3, используя NodeJS SDK и deleteObject API. Мой простой API для удаления объекта S3 выглядит так:

S3Store.prototype.unset = function(params) {
   return new Promise((resolve,reject) {
            var self=this;
            var extras = {
                Bucket: this._options.Bucket,
                Key: ''
            };
            for (var attrname in params) { extras[attrname] = params[attrname]; }
            if(Util.empty(extras.Key)) {
                return callback(new Error('bad key'), null);    
            }
            this.s3.deleteObject(extras, function(err, data) {
                if(err) {
                    return callback(err,null);
                }
                else {
                    return callback(null,data);
                }
            });
         });
        } // unset

Затем я называю его как

self.s3Store.unset({ Bucket: options.Bucket, Key: documentKey })
            .then(data => {
                if(!Util.empty(data) && data.DeleteMarker && !Util.empty(data.VersionId)) { // object version to delete
                    // The bucket is versioned - https://docs.aws.amazon.com/AmazonS3/latest/dev/DeleteMarker.html
                    // { "DeleteMarker": true, "VersionId": "aeW0.aiZyTSQzreFe0YkIkTgR.JXJK8y" }
                    self.s3Store.unset({ Bucket: options.Bucket, Key: documentKey, VersionId: data.VersionId})
                    .then(data => {
                        return callback(null, data);
                    })
                    .catch((error) => {
                        if (self.logger) self.logger.error("S3Dataset delete error key:%s error:%@", documentKey, error);
                        return callback(error);
                    }); 
                } else { // object deleted
                    return callback(null, data);
                }
            })
            .catch((error) => {
                if (self.logger) self.logger.error("S3Dataset delete error key:%s error:%@", documentKey, error);
                return callback(error);
            });
        }//delete

, поэтому, когда я нахожу, что объект версионен, потому что ответ deleteObject Имеет

{ "DeleteMarker": true, "VersionId": "aeW0.aiZyTSQzreFe0YkIkTgR.JXJK8y" }

Я снова вызываю тот же API, добавляя VersionId:

self.s3Store.unset({ Bucket: options.Bucket, Key: documentKey, VersionId: data.VersionId})

, но все равно получаю тот же ответ, без надлежащего удаления этой версии объекта.

...