我正在尝试使用AppSync将许多项目批量放入DynamoDB。当我调用解析器时,它不会引发任何错误,但不会将任何内容保存到数据库中。
架构
type BoxScore @model {
id: ID!
userId: String!
gameVariant: String!
complete: Boolean!
failFact: BoxScoreFact @connection
totalCorrect: Int!
}
type BoxScoreFact @model {
id: ID!
left: Int!
right: Int!
gameVariant: String!
timestamp: Int!
correct: Boolean!
}
input BatchAddCreateBoxScoreFactInput {
id: ID
left: Int!
right: Int!
gameVariant: String!
timestamp: Int!
correct: Boolean!
boxScoreFactBoxScoreId: ID!
}
IAM角色:
"Effect": "Allow",
"Action": [
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem"
],
解析器:
#set($factsdata = [])
#foreach($item in ${ctx.args.facts})
$util.qr($factsdata.add($util.dynamodb.toMapValues($item)))
#end
{
"version" : "2018-05-29",
"operation" : "BatchPutItem",
"tables" : {
"TABLENAME": $utils.toJson($factsdata)
}
}
从AppSync游乐场打电话:
响应映射模板:
#if($ctx.error)
## Append a GraphQL error for that field in the GraphQL response
$utils.error($ctx.error.message, $ctx.error.message)
#end
{
"boxScoreFacts": $util.toJson({"res": "no error", "ctx": $ctx}),
}
功能测试运行的输出模板:
DynamoDB表
其中
TABLENAME
设置为等于DDB控制台中显示的DynamoDB表名称。像BoxScoreFact-woieieie99392-prod这样的东西。该表始终为空,响应为空。这几乎是直接从example from the docs中提出的。另外,我应该注意,使用普通的create graphql函数放置一项确实会将一项放置在预期的表中。
我在这里想念什么?
最佳答案
通过无服务器Appsync插件调用Appsync的lambda函数,在此角色内,旧版本中缺少BatchWriteItem。
在您的package.json文件中,尝试将插件版本更改为解决此问题的最新版本或GitHub版本。
这应该解决它:
"devDependencies": {
....
"serverless-appsync-plugin": "^1.1.0"
....
}
或者
"devDependencies": {
....
"serverless-appsync-plugin": "https://github.com/sid88in/serverless-appsync-plugin.git#e33b5cfd"
....
}
关于amazon-web-services - AppSync BatchGetItem不保存项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57650203/