You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sails-dynamodb创建对象时出现类型不匹配错误求助

解决Sails.js + sails-dynamodb创建对象时的"Type mismatch for attribute to update"错误

这个错误通常是因为数据类型与DynamoDB表结构/模型定义不匹配,或者主键配置有误导致的。结合你给出的代码,我帮你梳理几个关键问题和修复方案:

1. 主键配置错误

你的模型里把id的primaryKey设为'range',但DynamoDB的主键规则是:

  • 单主键仅需要分区键(hash)
  • 复合主键才需要同时设置分区键(hash)和排序键(range)

如果你的Category表是单主键设计,这里的配置完全错误,应该把primaryKey改为'hash',同时建议显式标记required: true确保创建时必须传入id:

// 修正后的模型
module.exports = {
  attributes: {
    id: {
      type: 'string',
      primaryKey: 'hash', // 单主键设为hash
      required: true,
      columnName: 'id' // 明确对应DynamoDB表的字段名
    },
    picture: {
      type: "string",
      required: true
    },
    title: {
      type: "string",
      required: true
    },
    subcategories: {
      collection: 'Subcategory',
      via: 'category_ref'
    },
    user_ref: {
      model: 'User',
      type: 'string' // 显式指定为字符串类型,匹配User模型的主键类型
    }
  }
};

2. ID生成的类型不匹配

你代码里写的new Stri...应该是new String()之类的写法?注意new String()会返回一个String对象,而DynamoDB只接受原始字符串类型,这会直接导致类型不匹配错误。

正确的做法是直接使用字符串字面量,或者用String()转换(而非构造函数),也可以用UUID生成唯一id:

// 修正后的控制器create方法
create: function (req, res, next) {
  let name = "sometext";
  // 用原始字符串或UUID生成id,避免使用String对象
  var obj = {
    id: "category-123", // 或者用uuid:require('uuid').v4()
    picture: "https://example.com/pic.jpg",
    title: name,
    user_ref: "user-456" // 必须传入User模型的主键字符串,不能传对象
  };

  Category.create(obj)
    .then(createdCategory => res.ok(createdCategory))
    .catch(err => {
      console.error("创建失败:", err);
      return res.serverError(err);
    });
}

3. 关联字段的类型检查

另外要注意:

  • user_ref必须传入User模型的主键字符串,不能传入整个User对象
  • 如果创建时不需要关联subcategories,就不要在obj里传入这个字段,或者传入空数组(确保类型是数组)

额外注意事项

  • 确认你的DynamoDB表结构和模型定义完全一致:比如id是字符串类型的分区键,没有其他类型冲突
  • sails-dynamodb对关联的支持有限,创建对象时尽量只传入基础字段,关联关系可以后续用add方法添加

内容的提问来源于stack exchange,提问作者Gustavo García González

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:46:57