如何从 AWS API 网关检索数据并将其显示在 S3 上托管的静态网站中?



>我正在尝试向 AWS API Gateway 发出 ajax 请求,以显示 json 中包含的一些信息。目标是显示一个网页,当用户加载网页时,会向 API 网关发出 ajax 请求,该网关运行从 DynamoDB 检索一些数据的 lambda 函数。像这样:网站加载 -> API 网关被调用 -> lambda 函数被执行 ->数据从 DDB 检索 ->数据被返回到网站 html 并显示。正在传递的数据只是JSON格式,它包含一些条目,但我关心的只是一个int,"int" : "1"

以下是网站的 HTML 格式,它托管在 AWS S3 中:

<!DOCTYPE html>
<html lang="en-US">
<html>
<head>
</head>
<body>
<h1> This number was generated by the ESP32 </h1>
<div id="entries">
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script type="text/javascript">
var API_URL = 'https://xxxxxxxxxx.execute-api.us-location-x.amazonaws.com/prod/gateway';
$(document).ready(function(){
$.ajax({
url: API_URL,
type: 'GET',
dataType: 'json',
success: function(data){
$('#entries').html('');
$('#entries').append('<p>' + data + '</p>');
alert(data);
}
});
});
</script>
</body>
</html>

。和 lambda 函数代码

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({ region: 'us-location-x' });
exports.handler = async (event) => {
let tableToRead = {
TableName: 'dataStore',
Limit: 10
};
const headers = {
"Access-Control-Allow-Origin": '*'
// other headers 
}
try {
const data = docClient.scan(tableToRead).promise();
return {
statusCode: 200,
body: JSON.stringify(data),
headers: headers
}
} catch (error) {
return {
statusCode: 400,
body: error.message,
headers: headers
}
}
};

目前,如果我测试 lambda 函数(在 lambda 仪表板中(,它会返回 JSON 格式,但正文部分为空,它只是{ }。我需要返回的数据包含标头以及来自 DynamoDB 的内容。返回如下所示:

Response:
{
"statusCode": 200,
"body": "{}",
"headers": {
"Access-Control-Allow-Origin": "*"
}
}

但它应该看起来像这样:

Response:
{
"statusCode": 200,
"body": "{
"Items": [
{
"Payload": {
"int": 6
},
"Row": "0",
"PositionInRow": "0"
}
],
"Count": 1,
"ScannedCount": 1
}",
"headers": {
"Access-Control-Allow-Origin": "*"
}
}

或类似的东西...来自数据库的数据无关紧要,我只需要"int"参数。这只是我在使用 lambda 时遇到的问题,我还需要知道如何将该信息获取到 HTML 文件中。目前,当我运行网站时,它只显示[object Object]何时应该只显示 json 中包含的int的值。我不知道我是否走在正确的轨道上。我对js,ajax,json和html几乎没有经验,如果这是显而易见的,请原谅我! 感谢您的任何帮助!

更新:从 lambda 代码中删除JSON.stringify(data)并仅输入一个1,使正文包含 int 并显示在网站中。这是预期的,但我只是想一块一块地走,直到我再次打破它。

您可以在此处访问项目data.Items

const data = await docClient.scan(param).promise();
return {
statusCode: 200,
body: data.Items,
headers: headers
}

因此,与其data.Itemsdata.Item[0].Payload.int只接收int价值。

最新更新