Sails.js+MongoDB使用UserTM.create()报错:首个参数必须为字典
Sails.js 1.5 + Waterline + MongoDB 4.4: AdapterError 调用
UserTM.create()触发"1st argument must be a dictionary" 环境
- Sails.js 1.5
- Waterline ORM
- MongoDB 4.4
问题详情
调用UserTM.create()创建记录时触发AdapterError,报错提示1st argument must be a dictionary。文档已成功写入MongoDB,但仍抛出该错误。
报错信息
Error [AdapterError]: Unexpected error from database adapter: 1st argument must be a dictionary
待保存载荷示例
{ "trademark": "5a99562721b803b3d6e2e2f2", "team": "58428b2c801fe60321d48f0c", "party": "opponent", "precomputed_data": {}, "dontWatch": false, "createdBy": "58428b2c801fe60321d48f15", "brand": "66df40d5108f03c2c253876e" }
业务代码
let utm = { "trademark": "5a99562721b803b3d6e2e2f2", "team": "58428b2c801fe60321d48f0c", "party": "opponent", "precomputed_data": {}, "dontWatch": false, "createdBy": "58428b2c801fe60321d48f15", "brand": "66df40d5108f03c2c253876e" }; UserTM.create(utm).exec(function(err, userTm){ if (err) {return cb(err);} return cb(null, userTm); })
错误栈片段
Error [AdapterError]: Unexpected error from database adapter: 1st argument must be a dictionary at newConstructor.v.create (/path/to/sails/api/hooks/waterline/index.js:110:38) at sails.async.auto.createUserTM (/path/to/sails/api/controllers/UserTMController.js:432:24) at processNativeRecord (/path/to/sails/node_modules/sails-mongo/lib/private/machines/private/process-native-record.js:26:3)
已完成排查
- 确认载荷为合法JavaScript对象
- 验证MongoDB连接及适配器配置正常
- 尝试用
JSON.parse(JSON.stringify(data))转换载荷对象,问题依旧
解决方案建议
升级sails-mongo适配器版本:该错误大概率是适配器与Sails.js/Waterline版本不兼容导致的。报错栈指向
sails-mongo的process-native-record.js,建议升级到适配Sails.js 1.5的最新稳定版(如v2.0+系列),旧版本可能在处理空对象(如precomputed_data: {})时存在参数解析逻辑缺陷。检查UserTM模型定义:
- 确认
precomputed_data字段类型定义(如json或object),显式设置默认值为{}; - 校验关联字段(
trademark/team等)的关联配置是否正确,避免Waterline转换数据时出现异常。
- 确认
验证参数类型完整性:在
UserTM.create()前添加日志,确认utm的类型:console.log(typeof utm); // 应输出object console.log(Object.prototype.toString.call(utm)); // 应输出[object Object]确保对象在异步任务传递过程中未被意外修改为数组、null或其他非键值对类型。
改用async/await语法:替换回调函数写法,避免上下文嵌套可能引发的问题:
async function createUserTM() { try { let utm = { // 载荷内容 }; let userTm = await UserTM.create(utm).fetch(); return userTm; } catch (err) { throw err; } }调试适配器逻辑:若升级无效,可临时查看
sails-mongo的process-native-record.js第26行代码,确认该方法接收的第一个参数是否为预期的字典对象,定位Waterline传递的异常数据来源。
内容的提问来源于stack exchange,提问作者Sanket Kumbhare
相关产品推荐
相关产品推荐

