使用@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
相关产品推荐
相关产品推荐

