Amazon S3 Node.js SDK deleteObjects

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

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是asynchronous的,所以当你点击copyObject函数调用时,循环迭代结束并进入下一次迭代,而不是等待copyObject上的callback被调用。 您尝试使用var关键字为循环的每个迭代定义paramsvariables,但由于Javascript的函数级作用域不是块级作用域,因此实际上并不是在每次迭代中创build新variables。 你只有一个copyParmasdeleteParams实例。 所以你很快地通过循环, deleteParams停留在循环的最后一次迭代中所接收的值上。 最后, copyObject调用的callbackcopyObject开始启动,并且都使用deleteParams来调用deleteObject ,而deleteParams现在是最后一个了。 为了在循环中进行多个asynchronous调用,我喜欢使用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); }); 

只需要在s3的顶部实现文件夹重命名,我做了如下:(promise api)

  _getDataForItemRename(from, to) { return s3.listObjectsV2({Bucket: services.conf.workspace, Prefix: from}).promise() .then((data) => { const toCopy = []; const toRemove = []; const s3Contents = Object.assign([], data.Contents); // in case of a single dir (with no children) if (s3Contents.length === 0) { s3Contents.push({Key: from}); } s3Contents.forEach((item) => { const copyPromise = s3.copyObject({ Bucket: services.conf.workspace, Key: to, CopySource: services.conf.workspace + '/' + item.Key }).promise(); const deletePromise = s3.deleteObjects({ Bucket: services.conf.workspace, Delete: {Objects: [{Key: from}]} }).promise(); toCopy.push(copyPromise); toRemove.push(deletePromise); }); return {copy: toCopy, remove: toRemove}; }).catch((err) => { return Promise.reject(err); }); } return this._getDataForItemRename(_from, _to).then((files) => { return Promise.all(files.copy).then(() => { return Promise.all(files.remove).then(result => { return result; }); }); }).catch((err) => { return Promise.reject(err); });