JavaScript aws-sdk S3 deleteObject(s)成功但实际上并没有删除任何东西

时间:2016-01-27 21:41:21

标签: javascript express amazon-s3 aws-sdk

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

我已经像这样需要AWS SDK,它可以使用和不使用配置变量(应该这样):

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: [] }

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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) {}

答案 2 :(得分:0)

我真的不认为Aws会花那么长时间删除。我遇到了同样的问题,并通过更改文件名值解决了这个问题,最初我使用的是url,而不是使用上传图片时使用的文件名。