

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

# 在 AWS AppSync 中使用本地解析器
<a name="tutorial-local-resolvers-js"></a>

AWS AppSync 允许您使用支持的数据来源（AWS Lambda、Amazon DynamoDB 或 Amazon OpenSearch Service）执行各种操作。但在某些情况下，可能不必调用支持的数据来源。

这时本地解析器就很方便。本地解析器仅将请求处理程序结果**转发**到响应处理程序，而不会调用远程数据来源。字段解析是在 AWS AppSync 中完成的。

在很多情况下，本地解析器是非常有用的。最常用的使用案例是在不触发数据来源调用的情况下发布通知。为了说明该使用案例，让我们构建一个 pub/sub 应用程序，用户可以在其中发布和订阅消息。此示例利用了*订阅*，如果您不熟悉*订阅*，可以参考[实时数据](aws-appsync-real-time-data.md)教程。

## 创建 pub/sub 应用程序
<a name="create-the-pub-sub-application-js"></a>

首先，创建一个空白的 GraphQL API，方法是选择**从头开始设计**选项，并在创建 GraphQL API 时配置可选的详细信息。

在我们的 pub/sub 应用程序中，客户端可以订阅和发布消息。每条发布的消息包含名称和数据。将以下内容添加到架构中：

```
type Channel {
	name: String!
	data: AWSJSON!
}

type Mutation {
	publish(name: String!, data: AWSJSON!): Channel
}

type Query {
	getChannel: Channel
}

type Subscription {
	subscribe(name: String!): Channel
		@aws_subscribe(mutations: ["publish"])
}
```

接下来，让我们将一个解析器附加到 `Mutation.publish` 字段。在**架构**窗格旁边的**解析器**窗格中，找到 `Mutation` 类型，找到 `publish(...): Channel` 字段，然后单击**附加**。

创建一个 *None* 数据来源，并将其命名为 *PageDataSource*。将其附加到您的解析器。

使用以下代码片段添加您的解析器实施：

```
export function request(ctx) {
  return { payload: ctx.args };
}

export function response(ctx) {
  return ctx.result;
}
```

确保您创建解析器并保存所做的更改。

## 发送和订阅消息
<a name="send-and-subscribe-to-messages-js"></a>

要让客户端接收消息，它们必须先订阅收件箱。

在**查询**窗格中，执行 `SubscribeToData` 订阅：

```
subscription SubscribeToData {
    subscribe(name:"channel") {
        name
        data
    }
}
```

 每次调用 `publish` 变更时，只有在消息发送到 `channel` 订阅时，订阅者才会收到消息。让我们在**查询**窗格中试一下。当您的订阅仍在控制台中运行时，打开另一个控制台，并在**查询**窗格中运行以下请求：

**注意**  
我们在该示例中使用有效的 JSON 字符串。

```
mutation PublishData {
    publish(data: "{\"msg\": \"hello world!\"}", name: "channel") {
        data
        name
    }
}
```

结果类似下面这样：

```
{
  "data": {
    "publish": {
      "data": "{\"msg\":\"hello world!\"}",
      "name": "channel"
    }
  }
}
```

我们刚刚说明了如何使用本地解析器，即，在不离开 AWS AppSync 服务的情况下发布和接收消息。