我正在JS中开发一些业务管理软件,我发现自己需要使用DynamoDb进行ACID事务。幸运的是,AWS刚刚发布了transactGet和transactWrite API,涵盖了正确的用例!
我正在使用AWS.DynamoDb.DocumentClient对象进行其他调用,似乎事务处理操作没有公开给我使用。
我入侵了aws-sdk代码,发现了这样的接口导出("aws-sdk":"^2.368.0",document_client.d.js,第2076行(:
export interface TransactWriteItem {
/**
* A request to perform a check item operation.
*/
ConditionCheck?: ConditionCheck;
/**
* A request to perform a PutItem operation.
*/
Put?: Put;
/**
* A request to perform a DeleteItem operation.
*/
Delete?: Delete;
/**
* A request to perform an UpdateItem operation.
*/
Update?: Update;
}
然而,每当我尝试用这种方法调用客户端时,我都会返回一个Type错误,即:
TypeError: dynamoDb[action] is not a function
在本地,我可以破解sdk并公开所有内容,但在我的部署环境中不接受它。
我应该如何继续?
非常感谢!
编辑:如果有什么价值的话,那就是我用来打电话的代码:
dynamo-lib.js:
import AWS from "aws-sdk";
export function call(action, params) {
const dynamoDb = new AWS.DynamoDB.DocumentClient();
return dynamoDb[action](params).promise();
}
Lambda代码:
import * as dynamoDbLib from '../libs/dynamodb-lib';
import { success, failure } from '../libs/response-lib';
export default async function main(params, callback) {
try {
const result = await dynamoDbLib.call("transactWrite", params);
callback(null, success(result));
} catch (e) {
console.log(e);
callback(null, failure({"status": "Internal server error"}));
}
}
编辑2:文档客户端似乎真的不导出该方法。
AWS.DynamoDB.DocumentClient = AWS.util.inherit({
/**
* @api private
*/
operations: {
batchGetItem: 'batchGet',
batchWriteItem: 'batchWrite',
putItem: 'put',
getItem: 'get',
deleteItem: 'delete',
updateItem: 'update',
scan: 'scan',
query: 'query'
},
...
正如公认答案中所提到的,解决方法是直接从DynamoDB对象使用transactWriteItems方法。
谢谢你的帮助=D
干杯!
更新:
问题已解决
Github线程
AWS SDK目前不支持dynamodb文档客户端中的事务,我在github上提出了这个问题,目前的解决方法是不使用文档客户端
let aws=require("aws-sdk");
aws.config.update(
{
region:"us-east-1",
endpoint: "dynamodb.us-east-1.amazonaws.com"
}
);
var dynamodb = new aws.DynamoDB();
dynamodb.transactWriteItems();
还要确保您使用的是SDK v2.365.0和
更新aws-sdk包(>2.365(
使用var dynamodb = new aws.DynamoDB();
而不是var dynamodb = new aws.DynamoDB.DocumentClient();