要在AppSync中对多个表进行细粒度控制的变更,可以使用Lambda函数来处理数据的读取和写入操作,并在Lambda函数中进行必要的权限验证和逻辑处理。
以下是一个示例解决方案的代码示例:
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = async (event) => {
const { operation, payload } = event.arguments;
const { tableName, itemId, data } = payload;
// 根据操作类型执行相应的操作
switch (operation) {
case 'create':
return createItem(tableName, data);
case 'update':
return updateItem(tableName, itemId, data);
case 'delete':
return deleteItem(tableName, itemId);
default:
throw new Error(`Unsupported operation: ${operation}`);
}
};
// 创建新项
async function createItem(tableName, data) {
const params = {
TableName: tableName,
Item: data,
};
await docClient.put(params).promise(); // 使用DynamoDB的DocumentClient执行Put操作
return data;
}
// 更新现有项
async function updateItem(tableName, itemId, data) {
const params = {
TableName: tableName,
Key: { id: itemId },
UpdateExpression: 'set #attr = :value',
ExpressionAttributeNames: { '#attr': 'attribute' },
ExpressionAttributeValues: { ':value': data.attribute },
ReturnValues: 'ALL_NEW',
};
const result = await docClient.update(params).promise(); // 使用DynamoDB的DocumentClient执行Update操作
return result.Attributes;
}
// 删除项
async function deleteItem(tableName, itemId) {
const params = {
TableName: tableName,
Key: { id: itemId },
ReturnValues: 'ALL_OLD',
};
const result = await docClient.delete(params).promise(); // 使用DynamoDB的DocumentClient执行Delete操作
return result.Attributes;
}
在AppSync中创建一个新的数据源,类型为Lambda函数,并将上述Lambda函数与该数据源关联起来。
在AppSync的Schema定义中使用自定义的Mutation类型来描述细粒度的变更操作:
type Mutation {
createItem(tableName: String!, data: ItemInput!): Item
updateItem(tableName: String!, itemId: ID!, data: ItemInput!): Item
deleteItem(tableName: String!, itemId: ID!): Item
}
input ItemInput {
attribute: String!
}
type Item {
id: ID!
attribute: String!
}
现在,你可以使用AppSync的Mutation来创建、更新和删除表中的项。在每个Mutation中,你需要提供tableName参数来指定要操作的表名,以及data参数来指定要写入或更新的数据。Lambda函数将会根据请求的操作类型执行相应的操作,并返回相应的结果。
请注意,上述示例中使用的是AWS SDK for JavaScript来与DynamoDB进行交互。你可以根据自己的需求选择其他适合的方式来访问和操作DynamoDB。