我在寻找如何正确地将服务器端验证添加到我的AppSync GraphQL突变方面遇到问题.
本质上,我使用AWS仪表板来定义我的AppSync架构,因此为我创建了DynamoDB表,以及为数据设置的一些基本解析器.
不,我需要实现以下目标:
inventory和的球员goldpurchaseItem变异item_iditem_id存在关联DynamoDB的int'Items'表,检查玩家是否有足够的黄金,再次在关联DynamoDB的'Players'表中,如果是,写入PlayersDynamoDB表通过将项目添加到他们的库存和新的减去黄金金额.我认为实现这一目标的最有效方法是降低成本和延迟,是为AppSync使用"Apache Velocity"模板语言?
很高兴看到这个示例显示如何查询/写入DynamoDB,处理错误并正确解决突变.
vtl amazon-web-services amazon-dynamodb apache-velocity aws-appsync
我对 AppSync 错误处理有疑问。我想发送errorInfo对象以及错误响应,我尝试了$util.error. 根据文件:
https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html
\n\n\n\n\n\n\n
$util.error(String, String, Object, Object)抛出自定义错误。如果模板检测到请求或调用结果有错误,则可以在请求或响应映射模板中使用该模板。此外,还可以指定 errorType 字段、data 字段和 errorInfo 字段。数据值将添加到 GraphQL 响应中错误内的相应错误块中。注意:数据将根据查询选择集进行过滤。errorInfo 值将添加到 GraphQL 响应中错误内相应的 error\n 块中。注意:errorInfo 将不会根据查询选择集进行过滤。
\n
这是我的 ResponseMappingTemplate 的样子:
\n\n#if( $context.result && $context.result.errorMessage )\n $utils.error($context.result.errorMessage, $context.result.errorType, $context.result.data), $context.result.errorInfo)\n#else\n $utils.toJson($context.result.data)\n#end\nRun Code Online (Sandbox Code Playgroud)\n\n这是我在解析器上所做的:
\n\nvar result = {\n data: null,\n errorMessage: \'I made this error\',\n errorType: \'ALWAYS_ERROR\',\n errorInfo: {\n errorCode: 500,\n validations: [\n {\n fieldName: \'_\',\n result: false,\n reasons: [\n \'Failed! Yay!\'\n ]\n }\n …Run Code Online (Sandbox Code Playgroud) 这是一个非常简单的问题,但我找不到使用SO-Search和Google的答案.
是否可以$user全局覆盖文件模板中使用的默认VTL变量,而不是在每个模板中设置它#set($user = "...")?
像IntelliJ本身的某种设置脚本,我可以在哪里改变价值?
提前致谢.
顺便说一下,我正在使用IntelliJ Ultimate 12.1.6.
如何从Velocity Template Script(VTL)中抛出用户定义的异常?
从我的速度脚本,我需要根据条件抛出异常,以便调用者可以捕获异常并向最终用户提供有用的错误消息.
例如.
#if($passwordfield1 != $passwordfield2)
throw an exception here
#elseif($passwordfield1 == $passwordfield2)
do something
#end
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,如果passwordfield1和passwordfield2不匹配,则应抛出适当的异常,并且需要将其传播给最终用户.
有没有办法从速度脚本实现这一点?如果没有,请建议另一种方法.
我想更新一个在许多不同的.vtl文件之间共享的宏,以包含一个新参数.但是,我只想更改我的一个.vtl文件中的调用,并保持其他文件保持不变.所以,我基本上想要添加一个可选参数,或者如果没有提供参数,则添加一个带默认值的参数.
文档(这里)提到了"#macro"部分中的可选默认值,但是经过几个小时的烦恼之后,我不能在生活中弄清楚正确的语法是什么.
所以我想采用现有的宏:
#macro( my_macro )
oldValue
#end
Run Code Online (Sandbox Code Playgroud)
并把它变成一个宏,如:
#macro( my_macro $param="oldValue" )
$param
#end
Run Code Online (Sandbox Code Playgroud)
我可以使用这两个调用中的任何一个正确调用它并获取指定的输出:
#my_macro() => oldValue
#my_macro("newValue") => newValue
Run Code Online (Sandbox Code Playgroud)
我已经尝试了文档中指定内容的每个排列,但找不到任何有效的方法.有谁知道正确的语法?有可能是我失踪的财产吗?
我正在使用Velocity 1.7和VelocityTools 2.0.velocimacro.arguments.strict=true
如果重要的话,我也在使用这个设置
.但是,如果没有一堆更新/重新测试,我无法轻易更改此属性.
我正在将Spark Java Web Framework与Apache的Velocity Template Engine结合使用,以帮助设计一个从SQL数据库中提取数据的响应式Web应用程序.使用SQL2o我创建了一些自定义类类型的Java对象,即用户,组,站点等.
我已经检查过并填充了创建的对象列表.当我然后将我的对象列表放入一个hashmap并返回一个ModelandView时,出于某种原因我的列表就在那里但我不能在vtl中使用它的任何属性.
main方法和Spark代码的相关部分:
public static void main(String[] args) {
WEB_LOGMGR loggr = new WEB_LOGMGR(true);
WEB_DBMGR dbmgr = new WEB_DBMGR(true, loggr);
Model backend = new ScadaModel(dbmgr, loggr);
System.out.println(dataToJson(backend.getUsers()));
staticFiles.location("/");
staticFiles.externalLocation("/");
String layout = "/templates/layout.vtl";
//secure("public/keystore.jks", "password", null, null);
before("/form", (request, response) -> {
boolean authenticated = false;
// ... check if authenticated
if (!authenticated) {
halt(401, "You are not welcome here");
}
});
get("/", (req, res) -> {
HashMap pdata = new HashMap();
pdata.put("template", "/templates/main.vtl");
return …Run Code Online (Sandbox Code Playgroud) 一般来说,我对 AppSync(和 GraphQL)很陌生,但是在将解析器连接到我们的 DynamoDB 表时遇到了一个奇怪的问题。具体来说,我们有一个嵌套 Map 结构用于我们任意构造的项目属性之一(其复杂性和形式取决于父项目的类型)——有点像这样:
"item" : {
"name": "something",
"country": "somewhere",
"data" : {
"nest-level-1a": {
"attr1a" : "foo",
"attr1b" : "bar",
"nest-level-2" : {
"attr2a": "something else",
"attr2b": [
"some list element",
"and another, for good measure"
]
}
}
},
"cardType": "someType"
}
Run Code Online (Sandbox Code Playgroud)
我们随附的 GraphQL 类型如下:
type Item {
name: String!
country: String!
cardType: String!
data: AWSJSON! ## note: it was originally String!
}
Run Code Online (Sandbox Code Playgroud)
当我们查询项目时,我们得到以下响应:
{
"data": {
"genericItemQuery": {
"name": "info/en/usa/bra/visa",
"country": "USA:BRA",
"cardType": …Run Code Online (Sandbox Code Playgroud) 我尝试使用AppSync更新DynamoDb表中的项目属性。一旦成功,我想使用该属性的先前值作为下一次调用的键(我正在使用管道解析器)。
要使用DynamoDB实现此目的,您只需将UPDATED_OLD设置为返回值即可。
我找不到任何用于指定 AppSync DynamoDB 解析器返回值的文档。我尝试过以下方法。
{
"version" : "2018-05-29",
"operation" : "UpdateItem",
"key": {
"id": $util.dynamodb.toDynamoDBJson("foo")
},
"condition" : {
"expression" : "attribute_exists(id)"
},
"update" : {
"expression" : "SET bar = :bar",
"expressionValues" : {
":bar" : {"S" : "$bar"}
}
},
"returnValues": "UPDATED_OLD"
}
Run Code Online (Sandbox Code Playgroud)
但它的语法无效。
"message": "Unsupported element '$[returnValues]'."
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 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!
}
Run Code Online (Sandbox Code Playgroud)
IAM 角色:
"Effect": "Allow",
"Action": [
"dynamodb:DeleteItem",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:Query",
"dynamodb:Scan",
"dynamodb:UpdateItem",
"dynamodb:BatchGetItem",
"dynamodb:BatchWriteItem"
],
Run Code Online (Sandbox Code Playgroud)
解析器:
#set($factsdata = [])
#foreach($item in …Run Code Online (Sandbox Code Playgroud) 在我的 AWS APIGW Rest API 中,我尝试添加和/或更新提交的请求正文 (JSON) 上的属性。我能找到的每个示例都涉及构建新的 JSON 对象,而不是更新现有对象。
在集成请求映射模板中,我的传入数据正文如下所示。如果发布的是新对象,则它不会有 ID。如果它是一个现有对象,它将有一个 ID。 这里的目标是始终确保它具有 ID,方法是获取现有 ID 并将其设置回 JSON 对象或添加新 ID。
// New object getting added, No ID
{
"first_name" : "Toby",
"last_name" : "Keith"
}
// Existing object getting updated, Has ID
{
"id" : "abcdef"
"first_name" : "Toby",
"last_name" : "Keith"
}
Run Code Online (Sandbox Code Playgroud)
我的集成请求映射模板如下所示:
## Do we have an existing id? (this is correctly pulling the existing ID)
#set( $id = $input.path('$.id') )
## If no ID, create one …Run Code Online (Sandbox Code Playgroud) vtl ×10
aws-appsync ×5
graphql ×4
velocity ×3
java ×2
exception ×1
graphql-js ×1
json ×1
list ×1
spark-java ×1
user-defined ×1