直接从DynamoDB使用AppSync接收数据似乎适合我的情况,但是当我尝试在两者之间放置lambda函数时,我收到错误消息,提示“无法解析值(/ issueNewMasterCard / masterCards):不匹配错误,预期类型为LIST“
查看AppSync cloudwatch响应映射输出,我得到了:
Global.asax.cs
这是我配置响应映射模板的方式:
"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
}
}
}
Lambda函数:
type User {
userId: ID!
masterCards: [MasterCard]
}
type MasterCard {
cardId: String
}
type Mutation {
issueNewMasterCard(userId: ID!): User
}
答案 0 :(得分:1)
我认为问题在于使用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)
宏(https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html#dynamodb-helpers-in-util-dynamodb)。即您的解析器应该是:
$util.dynamodb.toDynamoDBJson($context.result.Item)
或者,您可能希望查看AWS.DynamoDB.DocumentClient
类(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html)。这包括getItem
等版本,这些版本会自动封送和解组专有的DynamoDB,以键入原始JSON。 (坦率地说,我发现它更容易使用并一直使用)。
在这种情况下,您可以保留旧的解析程序,因为您将返回masterCards
只是一个JSON数组的对象。