无法使用 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)));
我正在尝试将批量数据插入 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)));