You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@aws-sdk/client-s3上传图片遇UnknownError错误求助

使用@aws-sdk/client-s3上传图片至S3时遭遇400 UnknownError问题排查

使用@aws-sdk/client-s3将图片上传至AWS S3时触发400 UnknownError,多方尝试后仍无法定位具体问题,AWS仅返回UnknownError错误信息。以下是代码实现、错误栈及排查修复方案:

代码实现

const client = new S3({
    region: process.env.AWS_S3_REGION,
    credentials: {
        ccessKeyId: process.env.AWS_ACCESS_KEY,
        secretAccessKey: process.env.AWS_SECRET_KEY
    }
})

const upload = async (name, file, bucket=process.env.AWS_S3_BUCKET) => {

    const uploader = {
        Bucket: bucket,
        Key: name,
        Body: Buffer.from(file.data)
    }

    const upload = await client.putObject(uploader, (err, data) => {
        console.log('callback')
        console.log(err)
        console.log(data)
    })

    return {
        etag: upload.ETag.replace(/\"/g,""),
        location: upload.Location,
        key: Key,
        bucket: bucket
    }
}

错误信息

400: UnknownError
    at throwDefaultError (/app/node_modules/@aws-sdk/smithy-client/dist-cjs/default-error-handler.js:8:22)
    at deserializeAws_restXmlPutObjectCommandError (/app/node_modules/@aws-sdk/client-s3/dist-cjs/protocols/Aws_restXml.js:5782:43)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
    at async /app/node_modules/@aws-sdk/middleware-serde/dist-cjs/deserializerMiddleware.js:7:24
    at async /app/node_modules/@aws-sdk/middleware-signing/dist-cjs/middleware.js:14:20
    at async /app/node_modules/@aws-sdk/middleware-retry/dist-cjs/retryMiddleware.js:27:46
    at async /app/node_modules/@aws-sdk/middleware-flexible-checksums/dist-cjs/flexibleChecksumsMiddleware.js:58:20
    at async /app/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:7:26 {
        '$fault': 'client',
        '$metadata': {
        httpStatusCode: 400,
        requestId: '6ACVW778TJGP01YP',
        extendedRequestId:    'qv518QMX7msriUZgvRtEvysSdhAMKb2xUWUlEc8aOrkZSBB/Z7kQ2AAXLZU6KsUF4NOzLX01Fs4=',
        cfId: undefined,
        attempts: 1,
        totalRetryDelay: 0
    }
}

排查与修复方案

1. 凭证字段拼写错误

代码中credentials对象的ccessKeyId少写了字母a,正确字段名应为accessKeyId。该错误会导致AWS无法识别有效凭证,直接触发400客户端错误。

2. 混合使用async/await与回调函数

client.putObject支持Promise调用,同时使用await和回调函数会导致逻辑冲突,回调内的代码不会按预期执行。应移除回调,仅通过await获取返回结果。

3. 返回值中未定义变量

返回对象里的key: Key中的Key未定义,需替换为已声明的name或uploader.Key。

4. ETag处理逻辑冗余

AWS返回的ETag是带首尾双引号的字符串,使用replace(/\"/g,"")处理冗余,直接通过slice(1, -1)去除首尾引号更可靠。

修正后的代码

const client = new S3({
    region: process.env.AWS_S3_REGION,
    credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY, // 修复拼写错误
        secretAccessKey: process.env.AWS_SECRET_KEY
    }
})

const upload = async (name, file, bucket = process.env.AWS_S3_BUCKET) => {
    const uploader = {
        Bucket: bucket,
        Key: name,
        Body: Buffer.from(file.data)
    }

    // 仅使用await获取上传结果
    const uploadResult = await client.putObject(uploader);

    return {
        etag: uploadResult.ETag.slice(1, -1), // 可靠去除ETag首尾引号
        location: uploadResult.Location,
        key: name, // 使用已定义的name变量
        bucket: bucket
    }
}

内容的提问来源于stack exchange,提问作者Arif Sajal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 16:03:12