【发布时间】:2021-10-19 05:44:45
【问题描述】:
我有一个用 node.js 编写的 lambda,我想将数据推送到我的 dynamodb 表中。我的最终目标是让我的 api 请求拉入响应,然后将 items 部分中的结果直接推送到 dynamodb 但目前我的 lambda 只是通过查询和 createmessage 函数被忽略(目前使用静态数据进行测试)。我认为我的代码以某种方式混乱,因此需要一些帮助以使其正确运行,请参见下文:
// Loads in the AWS SDK
const AWS = require('aws-sdk');
// Creates the document client specifing the region
// The tutorial's table is 'in eu-west-2'
const ddb = new AWS.DynamoDB.DocumentClient({region: 'eu-west-2'});
exports.handler = async (event, context, callback) => {
// Captures the requestId from the context message
const requestId = context.awsRequestId;
// Handle promise fulfilled/rejected states
await createMessage(requestId).then(() => {
callback(null, {
statusCode: 201,
body: '',
headers: {
'Access-Control-Allow-Origin' : '*'
}
});
}).catch((err) => {
console.error(err)
})
};
// Function createMessage
// Writes message to DynamoDb table Message
function createMessage(requestId) {
const params = {
TableName: 'splunk-lambda',
Item: {
'id' : '101',
'message' : 'Hello from lambda'
}
}
return ddb.put(params).promise();
}
var request = require('request');
var options = {
'method': 'POST',
'url': 'myurl',
'headers': {
'x-api-key': 'my-api-key',
'Content-Type': 'text/plain'
},
body: 'query my graphql query'
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
我对 lambda 的回应:
Test Event Name
test
Response
null
Function Logs
{my graphql response}
END RequestId: bdf23337-ca51-4f8b-868c-314f4d048055
【问题讨论】:
-
这可能与您使用
async有关。由于您使用的是异步处理程序,因此您的 lambda 在其余代码有机会运行之前完成。 -
Marcin 可能是正确的——我不能 100% 确定 node.js,但 Python 的 SDK 是异步阻止程序——必须使用 SDK 的特定异步版本才能在异步函数中使用它。我会冒险 node.js 版本可能有一些类似的问题。
-
它必须是异步的有什么特别的原因吗? SDK 在继续之前将始终等待其调用的响应。如果这是一个更大、更复杂过程的一部分,请尝试将其拉入自己的 lambda 并将您的 lambda 放入 StepFunction 中的并行步骤
-
@Marcin 你的权利,异步是阻塞器,删除和重写解决了这个问题。您能否将您的评论转换为答案?
-
@FreshX 谢谢。已添加答案。
标签: node.js amazon-web-services aws-lambda amazon-dynamodb