Nodejs AWS S3 createPresignedPost 返回错误无法读取未定义的属性(读取“endsWith”)

esi*_*ale 2 amazon-s3 node.js

我有以下代码:

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 运行了这些参数,效果很好,所以我确信它们不是这里的问题。有任何想法吗?

esi*_*ale 6

我已经弄清楚了,所以我要回答我自己的问题,以防有人用谷歌搜索这个问题。

问题是我进去keyFields这样做对于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)

我确实尝试过只传递BucketcreatePresignedPost,同时尝试不同的方法。显然,如果您不包含它Key并且它是必需的,则不会收到正确的错误。