Amazon web services 通过API网关从s3静态网站获取Lambda函数,给出415个不支持的媒体类型错误
我试图通过API网关从s3托管的静态网站获取(方法POST)到我的一个lambda函数,运行时语言是nodejs 下面是关于HTMLPOST表单的代码片段、执行post请求的JS脚本(转换json中的表单数据)以及my nodejs lambda函数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
<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> <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
}