首页 > 解决方案 > AWS Lambda - 只有在第二次测试触发后才能得到答案

问题描述

我正在用 TypeScript 开发一个 AWS Lambda,它使用 Axios 从 API 获取数据,这些数据将被过滤并放入 dynamoDb。

代码如下所示:

export {};
const axios = require("axios");
const AWS = require('aws-sdk');

exports.handler = async (event: any) => {
    const shuttleDB = new AWS.DynamoDB.DocumentClient();
    const startDate = "2021-08-16";
    const endDate = "2021-08-16";
    const startTime = "16:00:00";
    const endTime = "17:00:00";

    const response = await axios.post('URL', {
        data:{
            "von": startDate+"T"+startTime,
            "bis": endDate+"T"+endTime
        }}, {
            headers: {
            'x-rs-api-key': KEY
            }
        }
    );
    const params = response.data.data;
    const putPromise = params.map(async(elem: object) => {
        
        delete elem.feat1;
        delete elem.feat2;
        delete elem.feat3;
        delete elem.feat4;
        delete elem.feat5;
        
        const paramsDynamoDB = {
            TableName: String(process.env.TABLE_NAME),
            Item: elem
        }
        shuttleDB.put(paramsDynamoDB).promise();
    });
    await Promise.all(putPromise);
};

这一切都很好。如果第一次按下测试按钮,一切似乎都很好并且正在工作。例如,我console.log在开发过程中收到了所有 s 但数据没有放入 db

第二次尝试是相同的输出,但数据已成功放入 Db。

关于这个问题的任何想法?我该如何解决这个问题并在第一次尝试后将数据放入 Db?

提前致谢!

标签: javascripttypescriptamazon-web-servicesaws-lambdaaxios

解决方案


您需要从 db 调用中返回承诺 -

return shuttleDB.put(paramsDynamoDB).promise();

此外,Promise.all如果任何调用失败(与 Promise.allSettled 相比),将提前完成,因此可能值得注销任何可能发生的错误。

更好的是,看看 transactWrite - https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#transactWrite-property以确保全部或不写入


推荐阅读