2014-10-11 132 views
1

对node.js使用aws-sdk(2.0.18),我试图使用deleteObjects方法删除多个对象。AWS-SDK S3 deleteObjects返回MalformedXML?

delete: function (objects, callback) { 
    var s3delete = new AWS.S3(); 
    var params = { 
    Bucket: config.s3.bucket, 
    Delete: { 
     Objects: objects 
    } 
    }; 
    s3delete.deleteObjects(params, function (err, deleted) { 
    if (err) { 
     console.log(err, err.stack); 
     return callback(err); 
    } 
    return callback(null, deleted); 
    }); 
} 

我params对象是这样的:

{ Bucket: 'bucketname', 
    Delete: { 
    Objects:[ 
     {"Key":"folder/file.extension"}, 
     {"Key":"folder/file.extension"}, 
     {"Key":"folder/file.extension"}, 
     {"Key":"folder/file.extension"}, 
     {"Key":"folder/file.extension"}, 
     {"Key":"folder/file.extension"}, 
     {"Key":"folder/file.extension"} 
    ] 
    } 
} 

这将返回以下错误:

{ 
    message: "The XML you provided was not well-formed or did not validate against our published schema", 
    code: "MalformedXML", 
    time: "2014-10-11T10:35:52.525Z", 
    statusCode: 400, 
    retryable: false 
} 

按照API spec,这应该工作。仅供参考:我通过Mongoose Model的objects参数传递,它在Mongoose中保存为Mixed。

回答

1

这是由于Mongoose在原始objects数组中返回格式错误的JSON对象造成的。

为了专门解决这个问题,我不得不创建一个新的对象,并将其推到一个新的数组,在这个特定的情况下:

var s3Objects = []; 

objects.forEach(function(ele, index, arr) { 
    console.log(index + ': ' + ele.Key); 
    var thisKey = { 
    Key: ele.Key 
    }; 
    s3Objects.push(thisKey); 
}); 

然后在s3Objects传递给PARAMS:

var params = { 
    Bucket: config.s3.bucket, 
    Delete: { 
    Objects: properObjects 
    } 
}; 

它现在有效。