在Sails框架中更新模型记录遇‘Not Found’报错求助
解决Sails.js Waterline更新记录返回"Not Found"的问题
看起来你的问题出在几个细节上:async/await与then/catch混用导致逻辑模糊,没处理更新操作未匹配到记录的场景,还有错误信息获取的问题。我来帮你一步步修复:
问题拆解
- async/await 和 then/catch 混用:你已经用了
await,就没必要再链式调用.then()和.catch()了,这会让代码逻辑混乱,还容易漏掉未匹配记录的处理。 - 未处理无匹配记录的情况:当
Place.update()找不到ID为1的记录时,Waterline会返回undefined(部分版本返回空数组),但你的代码没做判断,可能触发框架默认的"Not Found"提示。 - 错误信息获取错误: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
相关产品推荐
相关产品推荐

