【问题标题】:JavaScript aws-sdk S3 deleteObject(s) succedes but doesn't actually delete anythingJavaScript aws-sdk S3 deleteObject(s) 成功但实际上并没有删除任何东西
【发布时间】:2020-10-27 08:42:20
【问题描述】:

在我正在构建的 MEAN.js 应用程序中,我将图像上传到 AWS S3。我正在尝试使用 AWS 开发工具包从站点中删除不需要的图像,但在成功调用 ajax 后,该文件仍保留在 S3 上。

我需要这样的 AWS 开发工具包,它可以在有和没有配置变量的情况下工作(应该如此):

var aws = require('aws-sdk');
aws.config.update({accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY});

对于我的路线,我有以下代码:

router.post('/delete', auth, function(req,res, next){
if(req.body.key) {
    var s3 = new aws.S3();
    var params = {
        Bucket: 'bucket name',
        Key: req.body.key
    };
    s3.deleteObject(params, function (err, data) {
        if (err) {
            console.log(err, err.stack);
            return next(err);
        }
        console.log(data);
        res.end('done');

我收到 200 响应,{} 已记录到控制台,但文件并未从存储中删除。我也试过像这样使用deleteObjects 方法:

var params = {
        Bucket: 'bucket name',
        Delete: {
            Objects: [
                {
                    Key: req.body.key
                }
            ]
        }

    };
    s3.deleteObjects(params, function (err, data) {
        if (err) {
            console.log(err, err.stack);
            return next(err);
        }
        console.log(data);
        res.end('done');

当我使用 deleteObjects 时,我得到 { Deleted: [ { Key: 'file name' } ], Errors: [] } 作为响应,但文件仍在 S3 上。

我做错了吗?我以为我按照文档去了一个 T。

此外,无论是否在存储桶上启用版本控制,都会出现问题。启用版本控制后,我的回答是:

{ Deleted: 
[ { Key: 'file name',
   DeleteMarker: true,
   DeleteMarkerVersionId: 'long id' } ],
Errors: [] }

【问题讨论】:

  • 在检查文件是否仍然存在之前,您要等待多长时间? S3 最终是一致的,因此它可能会在一段时间内保持可用(不确定多长时间)。
  • 我已发送多次删除请求的图像已持续至少 30 分钟。我尝试发送一个删除电话,但它也从未被删除。但这绝对是未来要记住的事情。谢谢克里斯。
  • 这仅在我使用 then/catch 语法时才对我有效。使用 async/await 我得到与 OP 相同的结果。

标签: javascript express amazon-s3 aws-sdk


【解决方案1】:

试试这个。您需要使用 promise() 确保在结束执行之前删除对象。即使考虑到 S3 99.999999999% 的持久性,仅仅为了一个简单的对象删除而等待 6 小时也是不正常的。

var params = {
        Bucket : bucket,
        Key : video
};
try {
    await s3.deleteObject(params,function(err,data){
        if (err)    console.log(err,err.stack);
        else        console.log("Response:",data);
    }).promise();
} catch (e) {}

【讨论】:

  • 也许单数 deleteObject 方法会立即删除对象。来自deleteObjects 的响应包含已删除的对象且没有错误,但对象并未立即从存储桶中删除。
  • 如果我们不调用promise(),则不会使用async-await 删除对象。谢谢你救了我的命:)
【解决方案2】:

看起来第一条评论是正确的,从 AWS S3 中删除文件需要一些时间。在这种情况下,它消失了一个多小时(可能是 6 小时,我走了很长一段时间)。

【讨论】:

  • 在我的情况下 10 天后它仍然没有被删除。但是通过代码并没有得到任何 AmazonServiceException
【解决方案3】:

我真的不认为 Aws 需要很长时间才能删除。我遇到了同样的问题并通过更改文件名值解决了它,我最初使用的是 url 而不是使用上传图像时使用的文件名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多