最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

AWS Lambda Node Js

IT培训 admin 4浏览 0评论

AWS Lambda Node Js

如果存在其他元素,我要增加值。

+-----------------------+
| id | iteration | data |
+-----------------------+
| 10 |         1 | foo1 |
| 11 |         1 | foo2 |
| 12 |         2 | foo3 |
+-----------------------+

我的代码:

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'}); 
exports.handler = function(event, context, callback) {

var params = {
  Item: {
    id: uuid,
    iteration: 1,
    data: body.data
  },
  TableName: "my-table"
};

documentClient.put(params, function(err, data) {
    if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
      };
      callback(null, errResponse);
    } else {
      console.log("Success", params.Items);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify("thanks")
      };
      callback(null, response);
    }
  });

}

我的插入没问题。

我尝试:

var params = {
    TableName: "my-table",
    Key:{
        "id": uuid
    },
    UpdateExpression: "set iteration = iteration + :val",
    ExpressionAttributeValues:{
        ":val": 1
    },
    ReturnValues:"UPDATED_NEW"
  };
  documentClient.update(params, function(err, data) {
    if (err) {
        console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        const errResponse = {
          statusCode: 500,
          headers: {
            "Access-Control-Allow-Origin": "*"
          },
          body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
        };
        callback(null, errResponse);
    } else {
        console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
        const response = {
          statusCode: 200,
          headers: {
            "Access-Control-Allow-Origin": "*"
          },
          body: JSON.stringify("thanks")
        };
        callback(null, response);
    }
  });

更新是可以的(递增-> 2)

但是我想我想要增量值ONLY,如果还存在ONLY添加元素。两种方法都是异步的,应该怎么办?

回答如下:

您的第二个答案很接近。在UpdateExpression中,您需要同时将ADDSET放在同一行上。类似于以下内容:

    UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",

这已正式记录在DynamoDB下的AWS DOCS for UpdateItem中向下滚动说

ADD-如果属性没有指定的值,则将指定的值添加到项目已经存在。如果该属性确实存在,那么ADD的行为取决于属性的数据类型:如果现有属性是数字,并且“值”也是数字,然后将Value从数学上添加到现有属性。如果值是负数,然后从现有的数中减去属性。

我能够找到一个成功完成upsert的AWS forum post,以及在同一行中具有ADD和SET语法的另一个SO answer。下面是一些如果放置在新的lambda中将运行的代码(更改区域以匹配表的位置)

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-central-1'});

exports.handler = function(item, context, callback) {

    var params = {
        TableName: "my-table",
        Key:{
            "id": item.id
        },
        UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
        ExpressionAttributeValues:{
            ':iteration': 1,
            ':itemdata' : item.data
        },
        ReturnValues:"NONE"
};

documentClient.update(params, function(err, data) {
    if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
      };
      callback(null, errResponse);
    } else {
      console.log("Success", params.Items);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify("upsert complete.")
      };
      callback(null, response);
    }
  });
};

note:数据是保留关键字,出现以下错误:

Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: data

考虑将其更改为其他内容。我使用了itemdata

运行一次将插入一条新记录。以下图像是我第二次运行lambda之后表格的图像之前和之后的图像。

AWS Lambda Node Js

如果存在其他元素,我要增加值。

+-----------------------+
| id | iteration | data |
+-----------------------+
| 10 |         1 | foo1 |
| 11 |         1 | foo2 |
| 12 |         2 | foo3 |
+-----------------------+

我的代码:

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'}); 
exports.handler = function(event, context, callback) {

var params = {
  Item: {
    id: uuid,
    iteration: 1,
    data: body.data
  },
  TableName: "my-table"
};

documentClient.put(params, function(err, data) {
    if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
      };
      callback(null, errResponse);
    } else {
      console.log("Success", params.Items);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify("thanks")
      };
      callback(null, response);
    }
  });

}

我的插入没问题。

我尝试:

var params = {
    TableName: "my-table",
    Key:{
        "id": uuid
    },
    UpdateExpression: "set iteration = iteration + :val",
    ExpressionAttributeValues:{
        ":val": 1
    },
    ReturnValues:"UPDATED_NEW"
  };
  documentClient.update(params, function(err, data) {
    if (err) {
        console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        const errResponse = {
          statusCode: 500,
          headers: {
            "Access-Control-Allow-Origin": "*"
          },
          body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
        };
        callback(null, errResponse);
    } else {
        console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
        const response = {
          statusCode: 200,
          headers: {
            "Access-Control-Allow-Origin": "*"
          },
          body: JSON.stringify("thanks")
        };
        callback(null, response);
    }
  });

更新是可以的(递增-> 2)

但是我想我想要增量值ONLY,如果还存在ONLY添加元素。两种方法都是异步的,应该怎么办?

回答如下:

您的第二个答案很接近。在UpdateExpression中,您需要同时将ADDSET放在同一行上。类似于以下内容:

    UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",

这已正式记录在DynamoDB下的AWS DOCS for UpdateItem中向下滚动说

ADD-如果属性没有指定的值,则将指定的值添加到项目已经存在。如果该属性确实存在,那么ADD的行为取决于属性的数据类型:如果现有属性是数字,并且“值”也是数字,然后将Value从数学上添加到现有属性。如果值是负数,然后从现有的数中减去属性。

我能够找到一个成功完成upsert的AWS forum post,以及在同一行中具有ADD和SET语法的另一个SO answer。下面是一些如果放置在新的lambda中将运行的代码(更改区域以匹配表的位置)

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-central-1'});

exports.handler = function(item, context, callback) {

    var params = {
        TableName: "my-table",
        Key:{
            "id": item.id
        },
        UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
        ExpressionAttributeValues:{
            ':iteration': 1,
            ':itemdata' : item.data
        },
        ReturnValues:"NONE"
};

documentClient.update(params, function(err, data) {
    if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
      };
      callback(null, errResponse);
    } else {
      console.log("Success", params.Items);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify("upsert complete.")
      };
      callback(null, response);
    }
  });
};

note:数据是保留关键字,出现以下错误:

Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: data

考虑将其更改为其他内容。我使用了itemdata

运行一次将插入一条新记录。以下图像是我第二次运行lambda之后表格的图像之前和之后的图像。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论