Amazon web services 通过API网关从s3静态网站获取Lambda函数,给出415个不支持的媒体类型错误

Amazon web services 通过API网关从s3静态网站获取Lambda函数,给出415个不支持的媒体类型错误,amazon-web-services,amazon-s3,aws-lambda,aws-api-gateway,http-status-code-415,Amazon Web Services,Amazon S3,Aws Lambda,Aws Api Gateway,Http Status Code 415,我试图通过API网关从s3托管的静态网站获取(方法POST)到我的一个lambda函数,运行时语言是nodejs 下面是关于HTMLPOST表单的代码片段、执行post请求的JS脚本(转换json中的表单数据)以及my nodejs lambda函数 <form name='form' id="myForm"> <div id=whatpageisit><a href='index.html'>LOGIN</a

我试图通过API网关从s3托管的静态网站获取(方法POST)到我的一个lambda函数,运行时语言是nodejs

下面是关于HTMLPOST表单的代码片段、执行post请求的JS脚本(转换json中的表单数据)以及my nodejs lambda函数

<form name='form' id="myForm">
            <div id=whatpageisit><a href='index.html'>LOGIN</a>SIGNUP  </div>
            
            <p> <label>Username <input type='text' name='username' value=''></label> </p>
            <p> <label>Email <input type='email' name='email' value=''></label> </p>
            <p> <label>Password <input type='password' name='password' value=''></label> </p>
            <p> <label>Conferma Password <input type='password' name='conferma_password' value=''></label> </p>
            
            <p> <div id="submit"><label>&nbsp;<input type='submit'></label></div> </p>
        </form>
我还想澄清一下,我相信我的函数拥有所有正确的权限(在与Lambdafunction关联的IAM角色中),就好像我测试网关插入json格式的请求体一样,查询成功地插入到数据库中。 这里有一个响应屏幕,以及响应标题:

指定我在API上启用了CORS,并且我的头响应包含AllowControlallowOrigin:*

尽管如此,当我试图通过我的主页运行我的请求时,我得到了这个错误

如果我尝试在JS中插入mode:no cors,则会出现以下错误: POST net::ERR_中止415(不支持的媒体类型。

所以我找到了一些线程,其中解释了mode:no cors我的表单数据是text/char,而不是网关期望的application/json。 (网关具有内容类型application/json的集成请求(Lambda类型)的映射模板)

我尝试将映射模板正文内容类型更改为text/char,并从-->更改为:

现在,正如我们的第一个错误所预期的那样,在第一个错误中确定了启用模式:没有COR将导致不透明的响应:

因此,我不知道该怎么做,也不知道是什么导致了我的问题。首先,我不明白,当我从网关启用CORS时,为什么它会提示我关于CORS的错误,甚至响应头包含AllowControlAllowOrigin:*


此外,我还尝试将s3 bucket options错误页面添加到index.html中,正如有人建议的那样,作为不透明响应的解决方案,但最终我得到了

我需要做的是:将源代码添加到API->Enable Cors->Allow Control Allow Header。

415错误是根本问题;Cors消息是一个副作用。所以问题是我如何传递表单数据,所以JS脚本?我猜你使用的是某种API,它的数据编码方式与JSON不同?如果是这样,那么你需要:。@MarkoE我怎么知道它需要什么样的编码?如果我测试我的网关通过这种JSON请求{“username”:“mike”,“email”:mike@gmail.com", “password”:“grvdsc”},我得到了“errorMessage”:“无法读取未定义的属性‘username’”,至于HTTP获取。昨天至少在Gateway上运行良好。编码取决于将数据传递到的后端。因此,基本上有四种后端集成,其中两种被认为是“代理”“如果后端可以处理JSON数据。其他两个要求您使用VTL重写数据(在我前面评论的链接中)。以下是解释:。
<script> // https://gomakethings.com/serializing-form-data-with-the-vanilla-js-formdata-object/
            document.addEventListener('submit', function (event) {
                event.preventDefault(); 
                
                fetch('', {
                    //mode:"no-cors",
                    method: 'POST',
                    body: JSON.stringify(Object.fromEntries(new FormData(event.target))),
                    headers: {
                        'Content-type': 'application/json; charset=UTF-8'
                    }
                }).then(function (response) {
                if (response.ok) {
                    return response.json();
                }
                return Promise.reject(response);
                }).then(function (data) {
                    console.log(data);
                }).catch(function (error) {
                    console.warn(error);
                });
            });
        </script>
    exports.handler =  (event, context, callback) => { 
  context.callbackWaitsForEmptyEventLoop = false; 
      pool.getConnection(function(err,connection){
        var user = event.body.username;
        var email = event.body.email;
        var password = event.body.password;
        var sql0 = "INSERT INTO users VALUES ('"+user+"','"+email+"','"+password+"','')";
     
        connection.query(sql0, function (error, result, fields) {
          connection.release();
          if (error) {
            callback(error); 
          } else {  callback(null,result); }
         
        }); //end connection.query
      
      }); //end pool.getConnection
}