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

在Sails框架中更新模型记录遇‘Not Found’报错求助

解决Sails.js Waterline更新记录返回"Not Found"的问题

看起来你的问题出在几个细节上:async/await与then/catch混用导致逻辑模糊,没处理更新操作未匹配到记录的场景,还有错误信息获取的问题。我来帮你一步步修复:

问题拆解

  1. async/await 和 then/catch 混用:你已经用了await,就没必要再链式调用.then()和.catch()了,这会让代码逻辑混乱,还容易漏掉未匹配记录的处理。
  2. 未处理无匹配记录的情况:当Place.update()找不到ID为1的记录时,Waterline会返回undefined(部分版本返回空数组),但你的代码没做判断,可能触发框架默认的"Not Found"提示。
  3. 错误信息获取错误:Waterline的错误对象里并没有Errors属性,正确的错误信息应该从err.message(通用错误)或者err.invalidAttributes(验证规则错误)里取。

修复后的代码

update: async function (req, res, next) {
  try {
    // 明确更新条件与字段,确保语法符合Waterline规范
    const updatedPlace = await Place.update({ id: 1 })
      .set({ title: req.param('title') })
      .fetch();

    // 检查是否成功匹配并更新了记录
    if (!updatedPlace || (Array.isArray(updatedPlace) && updatedPlace.length === 0)) {
      return res.status(404).json({ status: false, errors: "目标记录未找到" });
    }

    // 适配不同Waterline版本的返回格式(部分版本返回数组,需取第一个元素)
    const result = Array.isArray(updatedPlace) ? updatedPlace[0] : updatedPlace;
    res.json({ status: true, result: result });
  } catch (err) {
    // 正确捕获并返回错误信息
    const errorContent = err.invalidAttributes || err.message;
    res.status(500).json({ status: false, errors: errorContent });
  }
},

关键说明

  • 统一用async/await + try/catch:代码逻辑更直观,能覆盖所有异常和边界场景。
  • 主动判断更新结果:明确检查是否返回了有效记录,没有的话主动返回404状态码和清晰提示,替代框架默认的模糊反馈。
  • 适配版本差异:部分新版本Waterline中update().fetch()返回的是包含更新记录的数组,所以需要做数组判断处理。
  • 正确获取错误信息:根据Waterline的错误结构,优先返回验证规则错误,再返回通用错误消息,让调试更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:57:10