【问题标题】:Unable to insert data into AWS DynamoDB table using a Lambda function无法使用 Lambda 函数将数据插入 AWS DynamoDB 表
【发布时间】:2020-09-27 15:54:50
【问题描述】:

我正在尝试将批量数据插入到 DynamoDB 表中,但使用 TypeScript 编写的 Lambda 函数甚至没有将单个数据插入到表中。

这是我的代码:-

import { DynamoDB } from 'aws-sdk';

import { generateUsers } from './src/generator';

const dynamodb = new DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });

let response: { statusCode: number; body: string; };

/**
 *
 * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
 * @param {Object} event - API Gateway Lambda Proxy Input Formatasvzsdsdsffd
 *
 çn * @returns {Object} object - API Gateway Lambda Proxy Output Format
 * 
 */
export const lambdaHandler = async (event, context) => {
    try {
        const users = await generateUsers(20).then(data => data.users);

        users.forEach(async (user: { id: any; employeeId: any; }) => {
            console.log('emp id ->', user.employeeId);
            await writeData(user);
            console.log('done for emp id ->', user.employeeId);
        });
        
        console.log('done for all employess');

        response = {
            'statusCode': 200,
            'body': JSON.stringify({
                message: 'mock data..',
            })
        }
    } catch (err) {
        console.log(err);
        return err;
    }

    return response
};

const writeData = async (user: { id: any; employeeId: any; }) => {
    var params = {
        TableName: "MockedDataTable",
        Item: {
            "id": user.id,
            "employeeId": user.employeeId
        }
    };
    await dynamodb.put(params)
        .promise()
        .then((data) => {
            console.log(data);
        })
        .catch(err => {
            console.log(err);
        });
}

我在 Promise 中获取数据并且能够很好地记录,但是在使用 DynamoDB 表编写 (PutItem) 调用时,没有推送数据。

根据日志,有数据:-

2020-09-27T07:37:13.772Z        4463fa20-694e-14ce-a882-87cd0862eee7    INFO    emp id -> 58040
2020-09-27T07:37:13.773Z        4463fa20-694e-14ce-a882-87cd0862eee7    INFO    emp id -> 4968
2020-09-27T07:37:13.775Z        4463fa20-694e-14ce-a882-87cd0862eee7    INFO    done for all employess
END RequestId: 4463fa20-694e-14ce-a882-87cd0862eee7
REPORT RequestId: 4463fa20-694e-14ce-a882-87cd0862eee7  Init Duration: 3362.86 ms       Duration: 97.97 ms      Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 78 MB

{"statusCode":200,"body":"{\"message\":\"mock data..\"}"}

我可以知道错误在哪里,以便我可以解决这个问题吗?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda amazon-dynamodb


    【解决方案1】:

    我不确定这是否是答案,但是,您不能在 foreach 中使用 async/await。 用 for 代替。

      for (const user of users) {
        console.log('emp id ->', user.employeeId);
        await writeData(user);
        console.log('done for emp id ->', user.employeeId);
      }

    或者如果你不介意,如果你不介意的话,使用 Promise.all:

    await Promise.all(users.map(user => writeData(user)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多