【问题标题】:AWS lambda not pushing results to dynamodbAWS lambda 没有将结果推送到 dynamodb
【发布时间】: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


【解决方案1】:

基于 cmets。

问题是由使用async handler 引起的。这会导致您的函数在有机会运行其所有代码之前完成。

解决此问题的一种方法是将代码包装在new Promise 的处理程序中,如AWS docs 所示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2021-02-06
    • 2016-10-31
    • 2016-09-22
    • 1970-01-01
    • 2016-11-13
    • 2017-12-14
    相关资源
    最近更新 更多