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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:34:29