我尝试将多个对象复制到另一个文件夹后删除它们。
我的代码是这样的:
var deleteParam = {
Bucket: 'frontpass-test',
Delete: {
Objects: [
{Key: '1.txt'},
{Key: '2.txt'},
{Key: '3.txt'}
]
}
};
s3.deleteObjects(deleteParam, function(err, data) {
if (err) console.log(err, err.stack);
else console.log('delete', data);
});
返回的数据是:
delete { Deleted: [ { Key: '1.txt' }, { Key: '3.txt' }, { Key: '2.txt' } ],
Errors: [] }
所以我假设删除已完成。但是对象仍然存在于文件夹中,我的代码有问题吗?
我也尝试使用for循环和s3.deleteObject删除对象,但它仅删除文件列表中的最后一个对象。
for (var i = 0; i < files.length; i++) {
var copyParams = {
Bucket: 'frontpass-test',
CopySource: 'frontpass-test/unsold/' + files[i].filename,
Key: 'sold/' + files[i].filename
};
var deleteParam = {
Bucket: 'frontpass-test',
Key: 'unsold/' + files[i].filename
};
s3.copyObject(copyParams, function(err, data) {
if (err) console.log(err, err.stack);
else {
s3.deleteObject(deleteParam, function(err, data) {
if (err) console.log(err, err.stack);
else console.log('delete', data);
});
}
});
}
关于如何在我的情况下删除对象的任何想法?提前致谢。
最佳答案
好吧,第一个例子看起来不错。您是否在存储桶中启用了对象版本控制?即使您删除了文件,该文件也会保留一个副本。
第二个示例实际上包含一些错误,这些错误可以解释为什么仅删除最后一个错误。因为Node.js是异步的,所以当您单击copyObject
函数调用时,循环迭代将结束并转到下一个迭代,而无需等待copyObject
上的回调被调用。您尝试使用params
关键字为循环的每次迭代定义var
变量,但是由于Javascript具有函数级别范围而不是块级别范围,因此实际上并没有在每次迭代上创建新变量。您只有copyParmas
和deleteParams
的一个实例。因此,您可以快速遍历循环,并且deleteParams
保持在循环的最后一次迭代中接收到的值。最终,对copyObject
调用的回调开始触发,并且它们都使用deleteObject
调用deleteParams
,现在这是最后一个。为了在一个循环中进行多个异步调用,我喜欢使用 async
library。使用它,您可以执行以下操作:
async.each(files, function iterator(file, callback) {
var copyParams = {
Bucket: 'frontpass-test',
CopySource: 'frontpass-test/unsold/' + file.filename,
Key: 'sold/' + file.filename
};
var deleteParam = {
Bucket: 'frontpass-test',
Key: 'unsold/' + file.filename
};
s3.copyObject(copyParams, function(err, data) {
if (err) callback(err);
else {
s3.deleteObject(deleteParam, function(err, data) {
if (err) callback(err)
else {
console.log('delete', data);
callback();
}
});
}
});
}, function allDone(err) {
//This gets called when all callbacks are called
if (err) console.log(err, err.stack);
});