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

Express.js+SQLite博客应用删除文章报错Cannot DELETE /author/1求助

解决Cannot DELETE /author/1的问题

按以下核心环节逐一排查:

1. 确认method-override中间件配置正确

method-override必须在解析表单数据之后、路由之前挂载,且要和表单里的_method参数对应:

const express = require('express');
const methodOverride = require('method-override');
const app = express();

// 先解析表单数据
app.use(express.urlencoded({ extended: true }));
// 配置method-override,监听查询参数中的_method
app.use(methodOverride('_method'));

// 之后挂载作者路由
const authorRouter = require('./routes/author');
app.use('/author', authorRouter);

如果中间件顺序颠倒(比如放在urlencoded之前),或者参数名不匹配(比如中间件监听的是请求头而非_method查询参数),会导致POST请求无法被转换成DELETE。

2. 验证路由挂载路径是否匹配

你的删除路由是router.delete("/:id", ...),必须确保这个router是挂载在/author路径下的(即上述代码中的app.use('/author', authorRouter))。如果挂载路径错误,比如直接挂在根路径app.use('/', authorRouter),实际DELETE路由会变成/:id,和表单的/author/1路径不匹配,就会触发Cannot DELETE /author/1报错。

3. 检查请求实际方法

在路由前添加调试中间件,查看点击删除后的请求详情:

app.use((req, res, next) => {
  console.log(`请求方法: ${req.method}, 请求路径: ${req.path}`);
  next();
});

如果控制台输出POST /author/1,说明method-override未生效,回到第一步检查中间件配置;如果输出DELETE /author/1仍报错,说明路由未正确定义,检查路由文件的路径和挂载逻辑。

4. 额外检查:SQLite删除逻辑(路由匹配后的问题)

若路由能匹配但无法删除数据,确认draftArticles表的主键为id,且SQL语句占位符使用正确。可在db.run回调中打印修改行数,验证删除操作是否生效:

global.db.run("DELETE FROM draftArticles WHERE id = ?", [id], function (err) {
  if (err) {
    next(err);
  } else {
    console.log(`删除了${this.changes}行数据`);
    res.redirect("/author/home");
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:28:10