Amplify部署AppSync JS解析器及MySQL Serverless V1调用问题
AWS AppSync JS解析器部署与MySQL Data API使用指南
1. 将AppSync JS解析器部署到Amplify应用
文件夹位置
将JS解析器文件放在Amplify项目的amplify/backend/api/<你的API名称>/resolvers目录下,文件命名需遵循<GraphQL类型>_<字段名>.js规则,比如Query_getUser.js对应Query类型下的getUser字段。
需要修改的文件与部署步骤
- schema.graphql:确保要绑定JS解析器的字段已在GraphQL schema中定义,示例:
type Query { getUser(userId: ID!): User } type User { id: ID! name: String! } - transform.conf.json:若之前用VTL解析器,直接替换为JS文件即可;若通过CLI添加,执行
amplify add resolver时选择JavaScript类型,CLI会自动生成文件框架并更新配置。 - 部署:把JS解析器放入指定目录后,运行
amplify push,Amplify会自动识别并部署该解析器。
2. 在JS解析器中调用MySQL Serverless V1 Data API执行SQL
前置准备
确保AppSync服务角色拥有访问RDS Data API的权限,可附加AmazonRDSDataFullAccess策略(或更细粒度的rds-data:ExecuteStatement权限)。
JS解析器示例代码
import { RDSDataClient, ExecuteStatementCommand } from "@aws-sdk/client-rds-data"; // 初始化RDS Data客户端 const rdsClient = new RDSDataClient({ region: "us-east-1" }); // 替换为你的区域 export const request = async (ctx) => { // 编写参数化SQL语句(避免SQL注入) const sqlQuery = "SELECT id, name FROM users WHERE id = :userId"; // 构建请求参数 const commandParams = { secretArn: "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysql-secret-xxxx", // 替换为你的Secret ARN resourceArn: "arn:aws:rds:us-east-1:123456789012:cluster:mysql-serverless-cluster", // 替换为你的Cluster ARN database: "my_database", // 替换为你的数据库名称 sql: sqlQuery, parameters: [ { name: "userId", value: { stringValue: ctx.args.userId } } ] }; try { // 执行SQL语句 const command = new ExecuteStatementCommand(commandParams); const response = await rdsClient.send(command); // 将RDS返回的记录转换为GraphQL类型格式 const formattedItems = response.records.map(record => ({ id: record[0].stringValue, name: record[1].stringValue })); return { items: formattedItems }; } catch (err) { throw new Error(`SQL执行失败: ${err.message}`); } }; export const response = (ctx) => { // 返回处理后的结果给AppSync return ctx.result.items[0]; // 根据业务需求返回单个或多个结果 };
关键说明
- SQL语句直接写在
request函数内,必须使用参数化查询(示例中的:userId和parameters数组),避免SQL注入风险。 - 无需手动安装AWS SDK依赖,Amplify会自动为AppSync解析器提供
@aws-sdk/client-rds-data包。 - 替换示例中的
region、secretArn、resourceArn、database为你的实际资源信息。
内容的提问来源于stack exchange,提问作者N N
相关产品推荐
相关产品推荐

