【问题标题】:How to pass an empty string as value of a field in dynamodb?如何将空字符串作为 dynamodb 中字段的值传递?
【发布时间】:2020-05-20 17:44:41
【问题描述】:

我正在尝试使用以下 json 数据进行发布请求。但我需要一个字段,即“注释”作为空字符串值传递。当我这样通过时,出现错误:

'一个或多个参数值无效:AttributeValue 不能包含空字符串'。

我该如何解决这个问题?

//json data which i need to post
  {
  "storeId": "106",
  "addressId": "1",
  "managerId": "1",
  "name": "Syammohan",
  "contactNo": "9656985685",
  "notes": "",
  "bookingType": "Weddding Consult",
  "bookingDate": "2019-05-02",
  "bookingTime": "09:00 am"
}

function bookingDone(employee) {
  var {

    storeId,
    addressId,
    managerId,
    name,
    contactNo,
    notes,
    bookingType,
    bookingStatus,
    bookingTime
  } = req.body

  console.log("notes", notes);

  const params = {
    TableName: "Booking",

    Item: {
      id: id,
      storeId: storeId,
      addressId: addressId,
      managerId: managerId,
      name: name,
      contactNo: contactNo,
      notes: notes,
      bookingType: bookingType,
      bookingStatus: bookingStatus,
      bookingDate: bookingDate,
      bookingTime: bookingTime,
      employeeId: employee.id

    },

  };

  docClient.put(params, (error) => {
    if (error) {
      console.log(error);
      res.status(400).json({ error: 'Could not create booking' });
    }
    // queue.push(JSON.stringify({ event: 'booking.booking.created', model: { 'Bookings': params.Item } }));
    res.send(params.Item)
    // res.json({ id, name, info });

  });
}

【问题讨论】:

  • dynamo 不接受空字符串,为什么不放一些通用字符串或完全离开该字段?
  • 你知道DDB是noSql吗?
  • 您的问题与 NodeJS 无关。不能设置"notes": null吗?
  • 来自文档Attribute values cannot be null. String and Binary type attributes must have lengths greater than zero.
  • 截至 2020 年 6 月,DynamoDB 现在原生支持空字符串。确保关闭convertEmptyValues,否则空字符串将被转换为NULL。 stackoverflow.com/a/62166912/1457398

标签: javascript node.js amazon-dynamodb


【解决方案1】:

是的,Dynamodb 不能接受空字符串。所以编辑 aws 配置

var docClient = new AWS.DynamoDB.DocumentClient({ 转换空值:真 });

这行得通!

【讨论】:

【解决方案2】:

属性及其值的映射。此映射中的每个条目都由一个属性名称和一个属性值组成。属性值不能为空;字符串和二进制类型属性的长度必须大于零;并且设置类型属性不能为空。包含空值的请求将被拒绝并出现 ValidationException 异常。

你可以通过定义一个函数来从对象中删除空字符串来解决这个问题

function removeEmptyStringElements(obj) {
  for (var prop in obj) {
    if(obj[prop] === '') {// delete elements that are empty strings
      delete obj[prop];
    }
  }
  return obj;
}
removeEmptyStringElements(req.body);

这将从您的对象中删除空属性。

如果您的对象包含嵌套对象,则使用以下函数

function removeEmptyStringElements(obj) {
  for (var prop in obj) {
    if (typeof obj[prop] === 'object') {// dive deeper in
      removeEmptyStringElements(obj[prop]);
    } else if(obj[prop] === '') {// delete elements that are empty strings
      delete obj[prop];
    }
  }

removeEmptyStringElements(req.body)

【讨论】:

    【解决方案3】:

    现在支持非键字符串/二进制属性中的空值 - AWS announcement

    【讨论】:

      【解决方案4】:

      Amazon DynamoDB 现在支持 DynamoDB 表中非键字符串和二进制属性的空值 https://stackoverflow.com/a/61909830/7532347

      【讨论】:

      • 感谢您的链接!用户是否需要更新任何内容?当我将 null 传递给可选时,我仍然收到 ValidationException 错误
      • 这重复了相同的更新answer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2020-06-16
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多