Обновление AWS Lambda Dynamo не обновляет элемент - PullRequest
0 голосов
/ 13 октября 2018

Существует таблица DynamoDB, которая называется Portal.Из лямбда-функции, написанной в узле, я хочу обновить поля status и ts элемента (путем вызова функции signalJobStart ) и дождаться завершения функции асинхронного обновления с обещанием, прежде чем продолжить,По какой-то причине обновление не происходит, однако ошибок во время операции не возникает.В журналах нет ошибок, и я вижу сообщение «ЗАВЕРШЕНО» в журналах.

Почему в элементе таблицы нет изменений?Почему я не вижу ни сообщения об ошибке, ни сообщения об успехе в журналах?

(Я также пытался без обещания с тем же результатом. Элемент таблицы не обновляется - даже асинхронно.)

Вот код из лямбды:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'eu-west-1'});

module.exports = {
signalJobStart: function(accountId, jobId) {
    console.log("Signaling job start for account %s and job %s", accountId, jobId);

    let table = "Portal";

    let params = {
        TableName: table,
        Key:{
            "accountid": accountId,
            "entity": jobId
        },
        UpdateExpression: "SET status = :s, ts = :t",
        ExpressionAttributeValues:{
            ":s": "running",
            ":t": Date.now()
        },
        ReturnValues:"UPDATED_NEW"
    };

    let updatePromise = docClient.update(params, function(err, data) {
        if (err) {
            console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
        }
    }).promise();

    updatePromise.then(function(data) {
      console.log('Success');
    }).catch(function(err) {
      console.log(err);
    });

    console.log("FINISHED");
}};

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

В вашем запросе status равно резервным ключевым словам и запрещено в dynamodb .Поэтому используйте ExpressionAttributeNames в своем запросе.

Также используйте новое Обещание для обещания ручки

Пожалуйста, проверьте ниже его помощь вам:

module.exports = {
  signalJobStart: function (accountId, jobId) {
    return new Promise(function (resolve, reject) {
      console.log("Signaling job start for account %s and job %s", accountId, jobId);

      let table = "Portal";

      let params = {
        TableName: table,
        Key: {
          "accountid": accountId,
          "entity": jobId
        },
        UpdateExpression: "SET #status = :s, ts = :t",
        ExpressionAttributeNames: {
          '#status': 'status'
        },
        ExpressionAttributeValues: {
          ":s": "running",
          ":t": Date.now()
        },
        ReturnValues: "UPDATED_NEW"
      };

      docClient.update(params, function (err, data) {
        if (err) {
          console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
          reject(err)
        } else {
          console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
          resolve({ message: 'sucsss', data: data })
        }
      })
    });
  }
};

Примечание: Пожалуйста, подтвердите, что accountid и entity оба являются Key в вашей БД.

0 голосов
/ 13 октября 2018

Я думаю, вы могли бы

docClient.update(params).promise()

, а затем продолжать использовать поток операторов .then(...), чтобы заставить его работать.Лично я думаю, что синтаксис обработчика ошибок (для update) может не дать вам обещание.

Дайте мне знать, если это не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...