Express.js+SQLite博客应用删除文章报错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
相关产品推荐
相关产品推荐

