我有以下代码:
const { S3Client } = require('@aws-sdk/client-s3');
const { createPresignedPost } = require('@aws-sdk/s3-presigned-post');
router.post(
'/sign-s3', async (req, res, next) => {
const { name, type } = req.body;
const client = new S3Client({
region: 'eu-central-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
});
const params = {
Bucket: process.env.S3_BUCKET_NAME,
Expires: 60,
Conditions: [
['content-length-range', 100, 5242880],
{ 'Content-Type': 'image/jpeg' },
],
Fields: {
key: `blog/${name}`,
'Content-Type': type,
success_action_status: '201',
},
};
try {
const data = await createPresignedPost(client, params);
return res.json(data);
} catch (err) {
return next({ status: 500, message: err.message });
}
}
);
Run Code Online (Sandbox Code Playgroud)
该路由返回以下错误:
Cannot read properties of undefined (reading 'endsWith')
Run Code Online (Sandbox Code Playgroud)
这个错误不是很有帮助。我尝试将凭据直接传递到 S3Client 对象配置中,因为我遇到了 V2 SDK 无法自动从 .env 读取凭据的问题(文档声称它应该这样做),但这没有帮助。我用 V2 运行了这些参数,效果很好,所以我确信它们不是这里的问题。有任何想法吗?
我已经弄清楚了,所以我要回答我自己的问题,以防有人用谷歌搜索这个问题。
问题是我进去key了Fields。这样做对于AWS js SDK v2来说没问题,但对于AWS js SDK v3则不然。v3createPresignedPost期望Key直接传递,如下所示:
const params = {
Bucket: process.env.S3_BUCKET_NAME,
Expires: 60,
Conditions: [
['content-length-range', 100, 5242880],
{ 'Content-Type': 'image/jpeg' },
],
Fields: {
'Content-Type': type,
success_action_status: '201',
},
Key: '${name}',
};
Run Code Online (Sandbox Code Playgroud)
我确实尝试过只传递Bucket到createPresignedPost,同时尝试不同的方法。显然,如果您不包含它Key并且它是必需的,则不会收到正确的错误。
| 归档时间: |
|
| 查看次数: |
1477 次 |
| 最近记录: |