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

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))转换载荷对象,问题依旧

解决方案建议

  1. 升级sails-mongo适配器版本:该错误大概率是适配器与Sails.js/Waterline版本不兼容导致的。报错栈指向sails-mongo的process-native-record.js,建议升级到适配Sails.js 1.5的最新稳定版(如v2.0+系列),旧版本可能在处理空对象(如precomputed_data: {})时存在参数解析逻辑缺陷。

  2. 检查UserTM模型定义:

    • 确认precomputed_data字段类型定义(如json或object),显式设置默认值为{};
    • 校验关联字段(trademark/team等)的关联配置是否正确,避免Waterline转换数据时出现异常。
  3. 验证参数类型完整性:在UserTM.create()前添加日志,确认utm的类型:

    console.log(typeof utm); // 应输出object
    console.log(Object.prototype.toString.call(utm)); // 应输出[object Object]
    

    确保对象在异步任务传递过程中未被意外修改为数组、null或其他非键值对类型。

  4. 改用async/await语法:替换回调函数写法,避免上下文嵌套可能引发的问题:

    async function createUserTM() {
      try {
        let utm = {
          // 载荷内容
        };
        let userTm = await UserTM.create(utm).fetch();
        return userTm;
      } catch (err) {
        throw err;
      }
    }
    
  5. 调试适配器逻辑:若升级无效,可临时查看sails-mongo的process-native-record.js第26行代码,确认该方法接收的第一个参数是否为预期的字典对象,定位Waterline传递的异常数据来源。


内容的提问来源于stack exchange,提问作者Sanket Kumbhare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:21