在 node.js Lambda for AWS 中处理连续的 DynamoDB 调用
Handling consecutive DynamoDB calls in a node.js Lambda for AWS
我的例子很简单。我在代理模式下使用 AWS Lambda,其中 index.js 看起来像这样。
const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');
const server = awsServerlessExpress.createServer(app);
exports.handler = (event, context) => {
console.log(`EVENT: ${JSON.stringify(event)}`);
return awsServerlessExpress.proxy(server, event, context, 'PROMISE').promise;
};
我有一个单独的 app.js 文件,其中有一个 POST 端点。在这个端点内,我需要在 DynamoDB table.
上进行两个查询
我需要先查询 table 以确定是否存在某些内容。
我的代码看起来像这样。
// DynamoDB Document Client
const docClient = new AWS.DynamoDB.DocumentClient();
app.post('/profile/:userSub', (req, res) => {
const userSub = req.params.userSub;
const accountName = req.body.accountName;
// First query
const params = {
TableName: profileTableName,
IndexName: profileIndexAccountName,
KeyConditionExpression: 'accountName = :accountName',
ExpressionAttributeValues: {
':accountName' : accountName
}
};
docClient.query(params, (err, data) => {
// Process the results
});
}
问题是我想根据第一个查询的结果进行后续查询docClient.put
。
我不明白如何将查询链接在一起,以便第一个查询在第二个查询执行之前完成。
有人可以给我举个例子吗?或者,如果使用 async/await 有更好的方法,那么我很乐意遵循它。
TL;DR 更喜欢 SDK 的 async-await 模式。
这里是一个连续的例子async-await calls using the AWS SDK for JavaScript v3.*. Note the async
keyword in the function signature and the await
keyword before the promise-returning method calls. The docs have the complete client initialization code。
// myLambda.js
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
// ... configure client
const ddbDocClient = DynamoDBDocument.from(client);
export async function handler(event) {
// ... other stuff
const getResult = await ddbDocClient.get({ TableName, Key });
const putResult = await ddbDocClient.put({
TableName,
Item: { id: '2', content: getResult.Item.Name },
});
}
* @aws-sdk/lib-dynamodb library's DynamoDBDocument
是代码中 v2 客户端的 v3 等价物。它公开了 .get
和 .put
等便捷方法。它还有助于在原生 js 类型和 DynamoDB 属性值之间进行转换。
我的例子很简单。我在代理模式下使用 AWS Lambda,其中 index.js 看起来像这样。
const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');
const server = awsServerlessExpress.createServer(app);
exports.handler = (event, context) => {
console.log(`EVENT: ${JSON.stringify(event)}`);
return awsServerlessExpress.proxy(server, event, context, 'PROMISE').promise;
};
我有一个单独的 app.js 文件,其中有一个 POST 端点。在这个端点内,我需要在 DynamoDB table.
上进行两个查询我需要先查询 table 以确定是否存在某些内容。 我的代码看起来像这样。
// DynamoDB Document Client
const docClient = new AWS.DynamoDB.DocumentClient();
app.post('/profile/:userSub', (req, res) => {
const userSub = req.params.userSub;
const accountName = req.body.accountName;
// First query
const params = {
TableName: profileTableName,
IndexName: profileIndexAccountName,
KeyConditionExpression: 'accountName = :accountName',
ExpressionAttributeValues: {
':accountName' : accountName
}
};
docClient.query(params, (err, data) => {
// Process the results
});
}
问题是我想根据第一个查询的结果进行后续查询docClient.put
。
我不明白如何将查询链接在一起,以便第一个查询在第二个查询执行之前完成。
有人可以给我举个例子吗?或者,如果使用 async/await 有更好的方法,那么我很乐意遵循它。
TL;DR 更喜欢 SDK 的 async-await 模式。
这里是一个连续的例子async-await calls using the AWS SDK for JavaScript v3.*. Note the async
keyword in the function signature and the await
keyword before the promise-returning method calls. The docs have the complete client initialization code。
// myLambda.js
import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb';
// ... configure client
const ddbDocClient = DynamoDBDocument.from(client);
export async function handler(event) {
// ... other stuff
const getResult = await ddbDocClient.get({ TableName, Key });
const putResult = await ddbDocClient.put({
TableName,
Item: { id: '2', content: getResult.Item.Name },
});
}
* @aws-sdk/lib-dynamodb library's DynamoDBDocument
是代码中 v2 客户端的 v3 等价物。它公开了 .get
和 .put
等便捷方法。它还有助于在原生 js 类型和 DynamoDB 属性值之间进行转换。