Мне нужно удалить версионный объект на 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})
, но все равно получаю тот же ответ, без надлежащего удаления этой версии объекта.