无法使用 Lambda 函数将数据插入 AWS DynamoDB table

Unable to insert data into AWS DynamoDB table using a Lambda function

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

这是我的代码:-

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) 调用时 table,数据没有被推送。

根据日志,数据在那里:-

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..\"}"}

请问哪里出错了,可以解决这个问题吗?

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

  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)));