gpt4 book ai didi

node.js - DynamoDB.putItem 函数未使用 sls 命令保存项目

转载 作者:太空宇宙 更新时间:2023-11-03 23:17:43 25 4
gpt4 key购买 nike

我在使用无服务器框架的 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 函数不会等待异步回调完成而是提前返回。

要使 saveRatingsToDB 正确地成为异步函数并强制其等待回调,您可以返回 dynamoDb.put 作为该函数的 promise :

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

关于node.js - DynamoDB.putItem 函数未使用 sls 命令保存项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53361254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com