

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从 VTL 迁移到 in JavaScript AWS AppSync
<a name="migrating-resolvers"></a>

AWS AppSync 允许您使用 VTL 或为解析器和函数编写业务逻辑。 JavaScript使用这两种语言，您都可以编写逻辑来指导 AWS AppSync 服务如何与您的数据源进行交互。在使用 VTL 时，您可以编写评估结果必须为有效 JSON 编码字符串的映射模板。使用 JavaScript，您可以编写返回对象的请求和响应处理程序。您不会返回 JSON 编码的字符串。

例如，采用以下 VTL 映射模板以获取 Amazon DynamoDB 项目：

```
{
    "operation": "GetItem",
    "key": {
        "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
    }
}
```

`$util.dynamodb.toDynamoDBJson` 实用程序返回 JSON 编码的字符串。如果 `$ctx.args.id` 设置为 `<id>`，则模板评估结果为有效的 JSON 编码字符串：

```
{
    "operation": "GetItem",
    "key": {
        "id": {"S": "<id>"},
    }
}
```

使用时 JavaScript，您无需在代码中打印出未经处理的 JSON 编码字符串，`toDynamoDBJson`也不需要使用类似的实用程序。上述映射模板的等效示例是：

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: {id: util.dynamodb.toDynamoDB(ctx.args.id)}
  };
}
```

另一种方法是使用 `util.dynamodb.toMapValues`，这是处理值对象的建议方法：

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  return {
    operation: 'GetItem',
    key: util.dynamodb.toMapValues({ id: ctx.args.id }),
  };
}
```

它的评估结果为：

```
{
  "operation": "GetItem",
  "key": {
    "id": {
      "S": "<id>"
    }
  }
}
```

**注意**  
我们建议将 DynamoDB 模块与 DynamoDB 数据来源一起使用：  

```
import * as ddb from '@aws-appsync/utils/dynamodb'

export function request(ctx) {
	ddb.get({ key: { id: ctx.args.id } })
}
```

再举一个例子，采用以下映射模板将项目放入 Amazon DynamoDB 数据来源中：

```
{
    "operation" : "PutItem",
    "key" : {
        "id": $util.dynamodb.toDynamoDBJson($util.autoId()),
    },
    "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args)
}
```

在评估后，该映射模板字符串必须生成有效的 JSON 编码字符串。使用时 JavaScript，您的代码会直接返回请求对象：

```
import { util } from '@aws-appsync/utils';
export function request(ctx) {
  const { id = util.autoId(), ...values } = ctx.args;
  return {
    operation: 'PutItem',
    key: util.dynamodb.toMapValues({ id }),
    attributeValues: util.dynamodb.toMapValues(values),
  };
}
```

它的评估结果为：

```
{
  "operation": "PutItem",
  "key": {
    "id": { "S": "2bff3f05-ff8c-4ed8-92b4-767e29fc4e63" }
  },
  "attributeValues": {
    "firstname": { "S": "Shaggy" },
    "age": { "N": 4 }
  }
}
```

**注意**  
我们建议将 DynamoDB 模块与 DynamoDB 数据来源一起使用：  

```
import { util } from '@aws-appsync/utils'
import * as ddb from '@aws-appsync/utils/dynamodb'

export function request(ctx) {
	const { id = util.autoId(), ...item } = ctx.args
	return ddb.put({ key: { id }, item })
}
```