使用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
相关产品推荐
相关产品推荐

