Node.js 正在将大于1MB的文件上载到s3,获取cors错误。否';访问控制允许原点';请求的资源上存在标头

Node.js 正在将大于1MB的文件上载到s3,获取cors错误。否';访问控制允许原点';请求的资源上存在标头,node.js,amazon-web-services,amazon-s3,cors,multer,Node.js,Amazon Web Services,Amazon S3,Cors,Multer,我正在尝试用express和multer将图像上传到s3。 我的前端通过AWS Amplify部署,后端通过Elastic Beanstalk部署 问题是,当我试图上传一个小于1MB的图像时,效果很好。但是如果文件大于1MB,我会得到下面的错误 CORS策略已阻止从源站访问位于“我的后端路由”的XMLHttpRequest:请求的资源上不存在“访问控制允许源站”标头 我认为问题在于Nginx限制了主体文件的大小,所以我对其进行了更改,但事实并非如此。 这是我的multer配置 import a

我正在尝试用express和multer将图像上传到s3。 我的前端通过AWS Amplify部署,后端通过Elastic Beanstalk部署

问题是,当我试图上传一个小于1MB的图像时,效果很好。但是如果文件大于1MB,我会得到下面的错误

CORS策略已阻止从源站访问位于“我的后端路由”的XMLHttpRequest:请求的资源上不存在“访问控制允许源站”标头

我认为问题在于Nginx限制了主体文件的大小,所以我对其进行了更改,但事实并非如此。

这是我的multer配置

import aws from "aws-sdk";
import multer from "multer";
import multers3 from "multer-s3";

const s3 = new aws.S3({
  accessKeyId: process.env.AMAZON_S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.AMAZON_S3_SECRET_ACCESS_KEY,
  region: "ap-southeast-2",
});

const postUpload = multer({
  storage: multers3({
    s3,
    bucket: 'bucket name'///,
    acl: "public-read",
    metadata: (req, file, cb) => {
      cb(null, { fileName: file.fieldname });
    },
    key: (req, file, cb) => {
      cb(null, Date.now().toString());
    },
  }),
  limits: { fileSize: 5242880 },
});

export const postUploadMiddleware = postUpload.array("files", 6);

export const uploadController = (req, res) => {
  console.log(req.files);
  const { files } = req;
  res.json(files);
};

///////
app.post("/api/post/upload", postUploadMiddleware, uploadController);
这是我的请求头,有错误

POST /api/post/upload HTTP/1.1
Host: 'host name'///
Connection: keep-alive
Content-Length: 1195613
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_0_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryLrPlKnjaQZwy7M1Z
Origin: 'frontend url'///
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: 'frontend url'///
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,ko-KR;q=0.8,ko;q=0.7

有人可以帮忙吗?

从标题开始,按如下方式设置标题:

  res.setHeader('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT');
  res.setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept, Authorization');
这是解决问题的办法。我还建议您在S3设置中检查COR。应该是这样的:

[
    {
        "AllowedHeaders": [],
        "AllowedMethods": [
            "GET",
            "POST",
            "PUT",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [],
        "MaxAgeSeconds": 3000
    }
]

这是因为Nginx的机身尺寸限制

我参考了这篇文章,解决了这个问题