Транзакционные операции aws-sdk-js, не представленные DocumentClient? - PullRequest
0 голосов
/ 01 декабря 2018

Я занимаюсь разработкой некоторого программного обеспечения для бизнес-администрирования в 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
Ура!

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Обновление пакета aws-sdk (> 2.365)

Использование var dynamodb = new aws.DynamoDB();

вместо var dynamodb = new aws.DynamoDB.DocumentClient();

0 голосов
/ 01 декабря 2018

ОБНОВЛЕНИЕ:

Проблема была решена

Github Thread

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 плюс

...