Я занимаюсь разработкой некоторого программного обеспечения для бизнес-администрирования в JS и нуждаюсь в ACID-транзакциях с DynamoDb.К счастью для меня, AWS только что выпустила API-интерфейсы transactGet и transactWrite, которые охватывают только правильный вариант использования!
Я использую объект 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;
}
Однако всякий раз, когда я пытаюсь вызвать клиента с помощью этих методов, я получаю сообщение об ошибке типа, а именно:
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();
}
Лямбда-код:
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"}));
}
}
Edit 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'
},
...
Как уже упоминалось в принятом ответе, обходной путь должен использовать метод transactWriteItems прямо из объекта DynamoDB.
Спасибо за помощь!= D
Ура!