如何使用$ util.error

时间:2018-11-27 06:23:19

标签: error-handling graphql graphql-js aws-appsync vtl

我对AppSync错误处理有疑问。我想将errorInfo对象与错误响应一起发送,并尝试使用$util.error。根据文档:

https://docs.aws.amazon.com/appsync/latest/devguide/resolver-util-reference.html

  

$util.error(String, String, Object, Object)

     

引发自定义错误。可用于请求或响应映射   模板(如果模板检测到请求或错误)   调用结果。此外,还有errorType字段,数据字段,   并可以指定一个errorInfo字段。数据值将被添加   到GraphQL中错误内的相应错误块   响应。注意:数据将根据查询选择进行过滤   组。 errorInfo值将添加到相应的错误中   阻止GraphQL响应中的内部错误。注意:errorInfo将不会   根据查询选择集进行过滤。

这是我的ResponseMappingTemplate的样子:

#if( $context.result && $context.result.errorMessage )
  $utils.error($context.result.errorMessage, $context.result.errorType, $context.result.data), $context.result.errorInfo)
#else
  $utils.toJson($context.result.data)
#end

这是我在解析器上所做的:

var result = {
  data: null,
  errorMessage: 'I made this error',
  errorType: 'ALWAYS_ERROR',
  errorInfo: {
    errorCode: 500,
    validations: [
      {
        fieldName: '_',
        result: false,
        reasons: [
          'Failed! Yay!'
        ]
      }
    ],
  }
};
callback(null, result);

这是我在CloudWatch日志中看到的内容:

{
    "errors": [
        "CustomTemplateException(message=I made this error, errorType=ALWAYS_ERROR, data=null, errorInfo={errorCode=500, validations=[{fieldName=_, result=false, reasons=[Failed! Yay!]}]})"
    ],
    "mappingTemplateType": "Response Mapping",
    "path": "[getError]",
    "resolverArn": "arn:aws:appsync:ap-southeast-1:....",
    "context": {
        "arguments": {},
        "result": {
            "errorMessage": "I made this error",
            "errorType": "ALWAYS_ERROR",
            "errorInfo": {
                "errorCode": 500,
                "validations": [
                    {
                        "fieldName": "_",
                        "result": false,
                        "reasons": [
                            "Failed! Yay!"
                        ]
                    }
                ]
            }
        },
        "stash": {},
        "outErrors": []
    },
    "fieldInError": true
}

这就是我的回应:

{
  "data": {
    "getError": null
  },
  "errors": [
    {
      "path": [
        "getError"
      ],
      "data": null,
      "errorType": "ALWAYS_ERROR",
      "errorInfo": null,
      "locations": [
        {
          "line": 2,
          "column": 3,
          "sourceName": null
        }
      ],
      "message": "I made this error"
    }
  ]
}

请注意,errorInfo为null,我知道如何获得CustomTemplateException。我怀疑是由于$utils.error的第4个参数。但是我不知道为什么。任何人都可以帮助指出错误或告诉我是否可以发送自定义errorInfo

1 个答案:

答案 0 :(得分:2)

事实证明,我使用了一些最新的教程中的代码。解析器映射模板有两种版本:<style> .carousel-item { position: relative; } .ex-img { position: absolute; left: 0; bottom:0; } </style> 2018-05-29。因此,我需要将模板版本更改为2017-02-28才能工作。

2018-05-29

在此处查看两个版本之间的更改:https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-changelog.html#changing-the-version-on-a-function