使用Sails.js 1.0开发CRUD应用时编辑/删除报404错误求助
解决Sails.js 1.0编辑/删除操作404的问题
兄弟,我之前从Sails.js 0.12升级到1.0的时候也踩过这个ID相关的坑!结合你说的情况,核心问题确实大概率出在ID的传递、路由匹配或者模型主键配置上,毕竟0.12和1.0在这部分有不少变化。下面给你一步步排查和解决的方案:
1. 先确认模型的主键配置
MongoDB默认用_id(ObjectId类型)作为主键,但Sails.js 1.0需要你在模型里显式指定主键,否则可能和蓝图路由的默认参数不匹配。打开你的Article.js模型文件,添加主键配置:
module.exports = { attributes: { title: { type: 'string', required: true }, content: { type: 'string' } // 你的其他字段 }, // 显式指定MongoDB的默认主键 primaryKey: '_id', datastore: 'mongodb' // 确保关联到你的MongoDB数据存储 };
2. 检查路由与请求URL是否匹配
Sails.js 1.0的RESTful蓝图路由(如果你用的话),编辑和删除的默认路由是:
- PUT
/article/:id(更新) - DELETE
/article/:id(删除)
你需要确认:
- 前端发起请求时,URL里的
:id是否是文章的_id值(比如/article/60d21b4667d0d8992e610c85) - 如果是自定义路由,要确保参数名和模型主键一致,比如不要写成
:articleId却在控制器里拿req.param('id')
举个例子,前端编辑按钮的链接应该是:
<a href="/article/edit/<%= article._id %>">编辑</a>
或者AJAX请求的URL:
fetch(`/article/${article._id}`, { method: 'PUT', body: formData })
3. 修正控制器里的ID查询逻辑
Sails.js 1.0的模型方法和0.12有差异,比如update现在是批量更新,要改用updateOne;同时查询时要明确用_id匹配(如果模型主键是_id的话)。
比如你的更新控制器方法应该写成这样:
async update(req, res) { try { const targetId = req.param('id'); // 用_id去匹配MongoDB的文档 const updatedArticle = await Article.updateOne({ _id: targetId }) .set(req.body); if (!updatedArticle) { return res.notFound('找不到要编辑的文章'); } return res.ok(updatedArticle); } catch (err) { return res.serverError(err); } }
删除方法类似:
async destroy(req, res) { try { const targetId = req.param('id'); const deletedArticle = await Article.destroyOne({ _id: targetId }); if (!deletedArticle) { return res.notFound('找不到要删除的文章'); } return res.ok('文章删除成功'); } catch (err) { return res.serverError(err); } }
4. 排查前端表单的ID传递
如果是通过表单提交编辑请求,要确保表单里正确传递了文章的_id,比如添加隐藏字段:
<form action="/article/<%= article._id %>" method="POST"> <!-- 添加隐藏字段指定请求方法为PUT --> <input type="hidden" name="_method" value="PUT"> <!-- 传递文章ID(如果路由参数已经包含,这步可以省略,但确保路由参数正确) --> <input type="hidden" name="_id" value="<%= article._id %>"> <!-- 其他表单字段 --> <input type="text" name="title" value="<%= article.title %>"> <textarea name="content"><%= article.content %></textarea> <button type="submit">保存修改</button> </form>
最后验证
打开浏览器的开发者工具,查看编辑/删除请求的Network标签:
- 确认请求URL里的ID和数据库里的
_id完全一致 - 确认请求方法是PUT(编辑)或DELETE(删除)
- 查看请求参数里是否包含正确的ID值
按照上面的步骤排查,基本就能解决404的问题了!
内容的提问来源于stack exchange,提问作者dipesh
相关产品推荐
相关产品推荐

