Amazon S3 Node.js 开发工具包删除对象

Don*_*ong 10 javascript amazon-s3 node.js

我试图将多个对象复制到不同的文件夹后删除它们。我的代码是这样的:

    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);
    });
Run Code Online (Sandbox Code Playgroud)

返回的数据为:

delete { Deleted: [ { Key: '1.txt' }, { Key: '3.txt' }, { Key: '2.txt' } ],
  Errors: [] }
Run Code Online (Sandbox Code Playgroud)

所以我认为删除已经完成。但对象仍然存在于文件夹中,我的代码有问题吗?

我还尝试使用 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);
            });
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

关于如何删除我的情况下的对象有什么想法吗?提前致谢。

Max*_*Max 4

第一个例子看起来不错。您是否在存储桶中启用了对象版本控制?即使删除文件后,也会保留文件的副本。

第二个示例实际上包含一些错误,可以解释为什么只有最后一个被删除。因为 Node.js 是异步的,所以当您点击copyObject函数调用时,循环迭代就会结束并进入下一次迭代,而不是等待回调copyObject被调用。params您尝试使用关键字为循环的每次迭代定义变量var,但由于 Javascript 具有函数级作用域而不是块级作用域,因此您实际上并未在每次迭代中创建新变量。您只有copyParmas和的一个实例deleteParams。因此,您可以快速运行循环并deleteParams保留在循环的最后一次迭代中接收到的值。然后最终调用的回调copyObject开始触发,并且它们都调用deleteObjectdeleteParams现在是最后一个。为了在循环中进行多个异步调用,我喜欢使用该async。使用它,您可以执行以下操作:

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);
});
Run Code Online (Sandbox Code Playgroud)