Как создать лямбда-функцию для обновления новой записи на усилении? - PullRequest
0 голосов
/ 20 апреля 2020

Как создать лямбда-функцию для обновления новой записи в проекте амплификации с использованием GraphQL?

У меня есть проект амплификации, использующий api GraphQL в качестве api (также DynamoDB).

Мое приложение простой список задач, просто для изучения, поэтому я сохраняю задачи на моем DynamoDB, вот моя схема:

type Todo @model @auth(rules: [{ allow: owner }]) {
    id: ID!
    title: String!
    status: String
}

Когда я создаю новый Todo, я устанавливаю только заголовок, а не статус, я хочу обновить состояние с помощью значения по умолчанию, используя лямбда-функцию триггера (я знаю, что мне не нужно так поступать, но я пытаюсь, чтобы узнать больше лямбда-функций при усилении).

Так что я следовал шаги из усиливают документы , но теперь я не могу понять, каков следующий шаг (я не знаком с aws лямбда-функциями).

Что я хочу сделать что-то вроде:

for each new record
newRecord.status = 'To do'
newRecord.update()

1 Ответ

1 голос
/ 21 апреля 2020

Когда вы впервые создаете элемент Todo, он сохраняется как элемент в таблице DynamodDB. Чтобы обновить элемент todo, вам необходимо обновить элемент в таблице DynamoDB.

Когда вы обновляете элемент в DynamoDB, вам нужно использовать AWS SDK для этого. Простейший sdk - использовать 1025 * Клиент документа DynamoDB , если вы используете nodejs в лямбда-функции.

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set the region
AWS.config.update({region: 'REGION'}); //replace Region with the region you are using ('EU-WEST-1')

// Create DynamoDB document client
var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});


// put the the following code in the exports.handler in your lambda function
var params = {
  TableName: 'Todo-SOMERANDOMSTRING-ENV',//The name of your dynamodb table
  Key: {
    'id' : 'asasd123-asdsa1-12sdasads-12', // the id of your todo item
  },
  UpdateExpression: 'set status = :s',
  ExpressionAttributeValues: {
    ':s' : 'To do' // what the new status should be
  }
};
// and run the update function
docClient.update(params, function(err, data) {
  if (err) {
    console.log("Error", err);
  } else {
    console.log("Success", data);
  }
});

Редактировать

Исходя из вашего комментария, я думаю, что вы, возможно, находитесь в разделе лямбда-триггеров DynamoDB (?), И ваша стандартная лямбда-функция может выглядеть следующим образом:

exports.handler = function (event, context) {
  console.log(JSON.stringify(event, null, 2));
  event.Records.forEach((record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log('DynamoDB Record: %j', record.dynamodb);
  });
  context.done(null, 'Successfully processed DynamoDB record');
};

Я не делал этот тип вызывайте себя раньше, поэтому я не совсем уверен, как структурированы данные в записи, но я думаю, что они могут быть доступны следующим образом:

record.data.id
//or
record.Item.id

Вы можете узнать это, перейдя к лямбда-консоли, найдите и откройте свою лямбда-функцию, go для «мониторинга», а затем откройте «Просмотр журналов в CloudWatch» в AWS и проверьте журналы CloudWatch после создания элемента.

Предполагая, что это запись. Элемент .id ваш лямбда-код может выглядеть так (не проверено):

var AWS = require('aws-sdk');
AWS.config.update({region: 'REGION'});
var docClient = new AWS.DynamoDB.DocumentClient({apiVersion: '2012-08-10'});

exports.handler = function (event, context) {
  console.log(JSON.stringify(event, null, 2));
     event.Records.forEach((record) => {
        var params = {
           TableName: 'YOUR-DB-TABLE-NAME',
           Key: {
              'id' : record.Item.id,
           },
           UpdateExpression: 'set status = :status',
           ExpressionAttributeValues: {
              ':status' : 'To do' // what the new status should be
           }
        };
        docClient.update(params, function(err, data) {
           if (err) {
              console.log("Error", err);
           } else {
              console.log("Success", data);
           }
        });
      });
   context.done(null, 'Successfully processed DynamoDB record');
 };

Я не думаю, что этот код полностью завершен, и вам, возможно, придется изменить, как / когда работает функция context.done (потому что я думаю, что не выполнится до того, как код завершит обновление элемента), но это может привести вас в правильном направлении.

...