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

Sails Model嵌套await调用出现unrecognized datastore错误如何解决

问题根因

你遇到的报错是sails-disk适配器未完成default数据存储注册时,过早触发模型写操作导致的。出现读操作(findOne)成功、写操作(updateOne)失败的原因是:sails-disk的读操作链路初始化早于写操作链路,读操作可通过预加载的元数据执行,写操作需要校验已注册的存储实例,初始化未完成时就会抛出未识别数据存储的错误。
触发时机问题是因为你在bootstrap.js中直接调用Job.Init()启动了定时任务,此时Sails的ORM钩子和磁盘适配器还未完成全量初始化流程。

解决方案

1. 调整定时任务启动时机(优先推荐)

修改bootstrap.js逻辑,等Sails完全启动完成后再初始化任务调度:

// config/bootstrap.js
module.exports.bootstrap = async function(done) {
  // 原有其他初始化逻辑保持不变

  // 监听Sails启动完成事件后再启动任务
  sails.on('lifted', async () => {
    await Job.Init();
  });

  return done();
};

2. 显式指定数据存储(兼容修复)

如果调整启动时机后仍偶现报错,可以在写操作时显式指定使用default数据存储,修改Job.js的Update方法:

updated = await Job.updateOne(query).set(updates).usingDatastore('default');

3. 确认数据存储配置

检查config/datastores.js中默认存储的配置是否正确指向sails-disk:

// config/datastores.js
module.exports.datastores = {
  default: {
    adapter: require('sails-disk'),
    // 可选配置:指定磁盘存储的文件路径
    // dir: '.tmp/diskDb'
  }
};

额外优化建议

在doJobRunner中增加空值判断,避免查询不到任务时出现undefined属性报错:

async function doJobRunner() {
  let job = await Job.findOne({state: 'inactive'});
  // 存在待处理任务才执行更新
  if (job) {
    let updated = await Job.Update(job);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:42:00