Функция DynamoDB.putItem не сохраняет элемент командой sls - PullRequest
0 голосов
/ 18 ноября 2018

У меня проблемы с моей функцией Lambda с Serverless Framework, которая должна передавать данные в 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/**

Как уже упоминалось, я не получаю сообщение об ошибке в консоли.Я могу войти и увидеть объект params из saveRatingsToDB.js, но ничего внутри действительной функции dynamoDb.put.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 19 ноября 2018

Вы пытались запустить saveRatingsToDB как асинхронную функцию, выполнив:

const db = await saveRatingsToDB(data, name);

К сожалению, при том, как эта функция написана в настоящее время, это не асинхронная функция. Причина, по которой вы не видите журнал внутри dynamoDb.put, заключается в том, что функция saveRatingsToDB не ожидает завершения асинхронного обратного вызова, а возвращает раньше.

Чтобы сделать saveRatingsToDB должным образом асинхронной функцией и заставить ее ждать обратного вызова, вы можете возвратить 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();
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...