Aws lambda 当Lambda介于两者之间时,如何使用AppSync和DynamoDB正确格式化数据
直接从DynamoDB使用AppSync接收数据似乎对我的情况有效,但当我尝试将lambda函数放在两者之间时,我收到的错误是“无法解析值(/issueNewMasterCard/masterCards):类型不匹配错误,预期类型列表” 查看AppSync cloudwatch响应映射输出,我得到以下结果:Aws lambda 当Lambda介于两者之间时,如何使用AppSync和DynamoDB正确格式化数据,aws-lambda,amazon-dynamodb,aws-appsync,Aws Lambda,Amazon Dynamodb,Aws Appsync,直接从DynamoDB使用AppSync接收数据似乎对我的情况有效,但当我尝试将lambda函数放在两者之间时,我收到的错误是“无法解析值(/issueNewMasterCard/masterCards):类型不匹配错误,预期类型列表” 查看AppSync cloudwatch响应映射输出,我得到以下结果: "context": { "arguments": { "userId": "18e946df-d3de-49a8-98b3-8b6d74dfd65
"context": {
"arguments": {
"userId": "18e946df-d3de-49a8-98b3-8b6d74dfd652"
},
"result": {
"Item": {
"masterCards": {
"L": [
{
"M": {
"cardId": {
"S": "95d67f80-b486-11e8-ba85-c3623f6847af"
},
"cardImage": {
"S": "https://s3.eu-central-1.amazonaws.com/logo.png"
},
"cardWallet": {
"S": "0xFDB17d12057b6Fe8c8c434653456435634565"
},...............
下面是我如何配置响应映射模板的:
$utils.toJson($context.result.Item)
我在做这个突变:
mutation IssueNewMasterCard {
issueNewMasterCard(userId:"18e946df-d3de-49a8-98b3-8b6d74dfd652"){
masterCards {
cardId
}
}
}
这是我的模式:
type User {
userId: ID!
masterCards: [MasterCard]
}
type MasterCard {
cardId: String
}
type Mutation {
issueNewMasterCard(userId: ID!): User
}
Lambda函数:
exports.handler = (event, context, callback) => {
const userId = event.arguments.userId;
const userParam = {
Key: {
"userId":{S:userId}
},
TableName:"FidelityCardsUsers"
}
dynamoDB.getItem(userParam, function(err, data) {
if (err) {
console.log('error from DynamDB: ',err)
callback(err);
} else {
console.log('mastercards: ',JSON.stringify(data));
callback(null,data)
}
})
我认为问题在于,在使用DynamoDB数据源时使用的
getItem
与aws sdk中的DynamoDB.getItem
函数不同
具体来说,数据源版本似乎返回了一个已编组的响应(即,它没有返回something:{L:[list of things]}
而是返回something:[list of things]
)
这很重要,因为这意味着当前设置中的$utils.toJson($context.result.Item)
正在返回{masterCards:{L:[…
,这就是您看到类型错误的原因-masterCards
在本例中是一个具有键L
的对象,而不是一个数组/列表
要在解析器中解决此问题,可以使用$util.dynamodb.toDynamoDBJson(Object)
宏()。也就是说,您的解析器应该是:
$util.dynamodb.toDynamoDBJson($context.result.Item)
或者,您可能想看看AWS.DynamoDB.DocumentClient
类()。这包括getItem
等版本。这些版本可以自动将专有DynamoDB键入的内容封送和解封回本机JSON(坦白地说,我发现一直使用它会更好)
在这种情况下,您可以保留旧的解析器,因为您将返回一个对象,其中
masterCards
只是一个JSON数组。Hi-您能给出lambda函数的概要吗(尤其是返回值)?@thomasmichaelwallace给你,如果你还需要更多,请随时询问。AWS.DynamoDB.DocumentClient
类是我的案例的正确解决方案,thx Thomas。