我正在尝试从我的Next上传文件。使用@aws-sdk/client-s3
包在Vercel上运行的js API端点。下面是一个例子:
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
import type { NextApiRequest, NextApiResponse } from "next";
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const s3Client = new S3Client({});
const uploadCommand = new PutObjectCommand({
Bucket: process.env.MY_S3_BUCKET,
Key: "test/testUpload.json",
Body: JSON.stringify({ message: "Hello World" }),
});
const response = await s3Client.send(uploadCommand);
res.status(200).json(response);
}
这段代码将在我的本地主机上完全正常运行,并按预期将文件上传到s3。但是,一旦将其部署到我的Vercel环境中,我就从@aws-sdk
包中收到以下错误。
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:399:5)
at ClientRequest.setHeader (node:_http_outgoing:663:11)
at mod.request (/var/task/___vc/__launcher.js:90:17)
at /var/task/node_modules/@aws-sdk/node-http-handler/dist-cjs/node-http-handler.js:70:25
at new Promise (<anonymous>)
at NodeHttpHandler.handle (/var/task/node_modules/@aws-sdk/node-http-handler/dist-cjs/node-http-handler.js:49:16)
at async /var/task/node_modules/@aws-sdk/middleware-serde/dist-cjs/deserializerMiddleware.js:5:26 {
code: 'ERR_HTTP_HEADERS_SENT',
'$metadata': { attempts: 1, totalRetryDelay: 0 }
}
使用以下软件包版本:
"@aws-sdk/client-s3": "3.278.0",
我已经多次验证了S3客户端连接的环境变量,并尝试了几种不同的方法来传递对象的主体/键。我还尝试使用promise链接代替wait,并将wait全部移除。最后,我尝试了返回来自端点的响应,而不是我在示例中的方式。
最奇怪的是,它在某个时候工作,我仍然有成功上传的文件在桶中。
任何想法/见解将不胜感激。
1条答案
按热度按时间9wbgstp71#
我是维塞尔队的斯瓦纳瓦。我们已经为这件事做了一个解决方案。