【发布时间】:2021-07-26 04:43:38
【问题描述】:
我在 AWS S3 存储桶中有一个对象,上面设置了一些元数据键。我在 AWS v2 JavaScript SDK 中使用 headObject() 获取键和值。
const headParams = {
Bucket: "THE_BUCKET",
Key: "THE_KEY"
};
S3.headObject(headParams, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
如果我随后使用 copyObject() 按键“修改”其中之一:
objectMetadata["SOME_EXISTING_METADATA_KEY"] = "Some New Value";
const params = {
Bucket: "THE_BUCKET",
Key: "THE_KEY",
CopySource: "THE_BUCKET/THE_KEY",
MetadataDirective: "REPLACE",
ACL: "public-read",
'Metadata': objectMetadata
};
S3.copyObject(params, (err, data) => {
if(err) {
console.log(err);
} else {
console.log(data);
}
});
然后再次调用headObject(),我得到了更新后的值,正如预期的那样。
如果我使用上面相同的 copyObject() 代码,但尝试添加对象上尚不存在的新元数据键:
...
objectMetadata["SOME_NEW_METADATA_KEY"] = "Some New Value";
...
我在 S3 控制台中看到了新值,但是当我再次调用 headObject() 时,新的元数据键没有出现。
但是,LastModified 标头中的时间戳显示当我添加新密钥时对象已被修改。而且,如果我使用 AWS CLI 检索同一对象的元数据,则会出现新键:
aws s3api head-object --bucket THE_BUCKET --key THE_KEY
{
"AcceptRanges": "bytes",
"LastModified": "2021-05-03T19:06:14+00:00",
"ContentLength": 18340648,
"ETag": "\"a8...\"",
"ContentType": "application/octet-stream; charset=UTF-8",
"Metadata": {
...
"SOME_NEW_METADATA_KEY": "Some New Value",
...
}
}
以前有人见过这种行为吗?我无法弄清楚为什么密钥会出现在控制台和 CLI 的结果中,而不是 JavaScript SDK。特别是因为 SDK 显示更新现有密钥的结果很好。
【问题讨论】:
标签: javascript amazon-web-services amazon-s3 aws-sdk-js