aws-sdk-js 处理未暴露给 DocumentClient 的操作?

aws-sdk-js transact operations not exposed to DocumentClient?

我正在用 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;
}

但是,每当我尝试用这种方法调用客户端时,我都会返回一个类型错误,即:

TypeError: dynamoDb[action] is not a function

在本地,我可以破解 sdk 并公开所有内容,但在我的部署环境中不被接受。

我应该如何进行?

非常感谢!

编辑: 如果它值得的话,有我用来调用的代码:

发电机-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 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 plus

更新 aws-sdk 软件包 (>2.365)

使用 var dynamodb = new aws.DynamoDB();

而不是 var dynamodb = new aws.DynamoDB.DocumentClient();