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