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
干杯!
更新:
问题已解决
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();
我正在用 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
干杯!
更新:
问题已解决
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();