DynamoDB.putItem 函数不使用 sls 命令保存项目
DynamoDB.putItem function not saving item with sls command
我在使用无服务器框架的 Lambda 函数时遇到问题,它应该将数据放入 DynamoDB。我不确定这个问题,因为当我 运行: sls invoke local -f scrape -d 'the-last-bookstore-los-angeles
时,我在控制台中没有收到任何错误消息。
saveRatingsToDB.js
const uuid = require('uuid');
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports = (data, businessName) => {
console.log('data saving...');
console.log(data);
const params = {
TableName: process.env.DYNAMODB_TABLE,
Item: {
id: uuid.v1(),
businessName: businessName,
reviewCount: data.reviewCount,
rating: data.rating,
createdAt: JSON.stringify(new Date())
}
};
// I am can log params okay, but nothing with dynamoDb.put is logged to the console
dynamoDb.put(params, error => {
console.log('putting data');
if (error) {
console.log(`Error saving data to DynamoDB: ${JSON.stringify(error)}`);
return Promise.reject(
`Error saving data to DynamoDB: ${JSON.stringify(error)}`
);
} else {
console.log('data saved');
return Promise.resolve(params.Item);
}
});
};
handler.js
'use strict';
const { getPage, parsePage, saveRatingsToDB } = require('./utils');
module.exports.scrape = async (event, context) => {
console.log('Function triggered', event);
const name = event;
const page = await getPage(name);
const data = await parsePage(page);
const db = await saveRatingsToDB(data, name);
return db;
};
serverless.yaml
provider:
name: aws
runtime: nodejs8.10
stage: dev
region: eu-west-2
environment:
DYNAMODB_TABLE: my-table-name
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn_reference_"
package:
include:
- utils/**
如前所述,我在控制台中没有收到任何错误消息。我可以记录并看到 saveRatingsToDB.js
中的 params
对象,但在实际的 dynamoDb.put
函数中什么也没有。
如有任何帮助,我们将不胜感激。
您尝试通过以下方式将 运行 saveRatingsToDB
作为异步函数:
const db = await saveRatingsToDB(data, name);
遗憾的是,按照目前这个函数的写法,它不是一个异步函数。您在 dynamoDb.put
中看不到日志的原因是 saveRatingsToDB
函数不等待异步回调完成,而是 return 更早。
要使 saveRatingsToDB
成为一个正确的异步函数并强制它等待回调,您可以 return 一个 dynamoDb.put 作为该函数的承诺:
module.exports = (data, businessName) => {
...
// use dynamoDb.put().promise() to return a promise from dynamoDb transaction
return dynamoDb.put(params, error => {
...
// Do whatever with the error
}).promise();
};
我在使用无服务器框架的 Lambda 函数时遇到问题,它应该将数据放入 DynamoDB。我不确定这个问题,因为当我 运行: sls invoke local -f scrape -d 'the-last-bookstore-los-angeles
时,我在控制台中没有收到任何错误消息。
saveRatingsToDB.js
const uuid = require('uuid');
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();
module.exports = (data, businessName) => {
console.log('data saving...');
console.log(data);
const params = {
TableName: process.env.DYNAMODB_TABLE,
Item: {
id: uuid.v1(),
businessName: businessName,
reviewCount: data.reviewCount,
rating: data.rating,
createdAt: JSON.stringify(new Date())
}
};
// I am can log params okay, but nothing with dynamoDb.put is logged to the console
dynamoDb.put(params, error => {
console.log('putting data');
if (error) {
console.log(`Error saving data to DynamoDB: ${JSON.stringify(error)}`);
return Promise.reject(
`Error saving data to DynamoDB: ${JSON.stringify(error)}`
);
} else {
console.log('data saved');
return Promise.resolve(params.Item);
}
});
};
handler.js
'use strict';
const { getPage, parsePage, saveRatingsToDB } = require('./utils');
module.exports.scrape = async (event, context) => {
console.log('Function triggered', event);
const name = event;
const page = await getPage(name);
const data = await parsePage(page);
const db = await saveRatingsToDB(data, name);
return db;
};
serverless.yaml
provider:
name: aws
runtime: nodejs8.10
stage: dev
region: eu-west-2
environment:
DYNAMODB_TABLE: my-table-name
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn_reference_"
package:
include:
- utils/**
如前所述,我在控制台中没有收到任何错误消息。我可以记录并看到 saveRatingsToDB.js
中的 params
对象,但在实际的 dynamoDb.put
函数中什么也没有。
如有任何帮助,我们将不胜感激。
您尝试通过以下方式将 运行 saveRatingsToDB
作为异步函数:
const db = await saveRatingsToDB(data, name);
遗憾的是,按照目前这个函数的写法,它不是一个异步函数。您在 dynamoDb.put
中看不到日志的原因是 saveRatingsToDB
函数不等待异步回调完成,而是 return 更早。
要使 saveRatingsToDB
成为一个正确的异步函数并强制它等待回调,您可以 return 一个 dynamoDb.put 作为该函数的承诺:
module.exports = (data, businessName) => {
...
// use dynamoDb.put().promise() to return a promise from dynamoDb transaction
return dynamoDb.put(params, error => {
...
// Do whatever with the error
}).promise();
};