目前我有一个S3静态网站与javascript请求命中Lambda返回一个项目从我的dynamodb数据库。我想我离成功很近了。似乎我所需要做的就是将DynamoDB版本的JSON转换为正常的JSON,例如通过互联网传递。
这是我的Rust Lambda中的一些内容。
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_dynamodb::model::AttributeValue;
use aws_sdk_dynamodb::Client;
use lambda_runtime::{service_fn, Error as LambdaError, LambdaEvent};
use serde_json::{json, Value};
...
...
let item = client
.get_item()
.table_name("example_table")
.key("example_key", AttributeValue::S(key_value.to_string()))
.send()
.await?;
let mapped_value = item.item().unwrap();
let json_value = json!({ "statusCode": 200, "body": format!("{:?}", mapped_value) });
Ok(json_value)
它返回一个正确的响应,但是用DynamoDB版本的JSON格式化。下面是其中一个简短的例子。
{"items": L([M({"load": N("2"), "name": S("Superlaser"), "item_type": S("Weapon")})])}
所以当我在前端的javascript收到这个响应时,它会出错;
Error SyntaxError: Unexpected token 'N', ..."apon_lr": N("10"), ""... is not valid JSON
我已经做了一些谷歌和遇到Rusoto和serde_dynamo,但我有很多麻烦,试图混合和匹配这些板条箱…感觉不对吗?在aws_sdk_dynamodb中没有转换吗?
非常类似于这个StackExchange问题,但针对Rust而不是Node.JS或Python。在AWS Lambda中将DynamoDB数据格式化为普通JSON
我最后做的是使用serde_dynamo::from_item和serde_json的组合。我建立了一个结构体…
use serde_derive::{Deserialize, Serialize};
use serde_dynamo::from_item;
use serde_json::{json, Value};
#[derive(Serialize, Deserialize)]
struct S { //just for example
txt: String,
}
let struc: S = from_item(mapped_value.clone()).expect("Should convert Item to S");
let json_value = serde_json::to_value(struc).expect("Should serialize to JSON");
结构需要匹配从DynamoDB获得的对象的结构。如果你要返回一堆项,那么应该有一个相应的serde_dynamo调用。