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

浏览器发送DELETE请求返回Cannot GET错误,Postman正常,求助

问题

浏览器发送DELETE请求时报错,GET方法可正常执行跳转,Postman发送DELETE请求能得到正确结果。前端使用Handlebars,相关代码及错误信息如下:

删除路由控制器

exports.deleteProduct = async (req, res) => {
    try {
        const savedData = await CreateProduct.findOneAndDelete({_id: req.params.id });
        res.redirect('/admin-panel/products');
    }
    catch (error) {
        console.log(error);
        res.status(400).send(error);
    }
}

删除路由配置

router.delete('/admin-panel/products/delete/:id',verifyJWT,getInfo,deleteProduct);

跳转目标路由

router.get('/admin-panel/products',verifyJWT,getInfo,renderProdutsPage)

错误信息

Cannot GET /admin-panel/products/delete/6342f2a5e8884cf054571479


解决方案

核心原因

浏览器地址栏访问或普通<a>标签默认发送GET请求,但你的服务器仅配置了DELETE方法的路由,因此触发Cannot GET错误。Postman可手动指定请求方法,所以能匹配路由;你提到GET方法可正常执行,本质是如果将路由改为GET能命中,但这不符合RESTful规范。

正确解决方式

1. 用表单+method-override发送DELETE请求(推荐)

HTML表单原生只支持GET/POST,需借助method-override中间件实现DELETE请求:

  • 安装依赖:
npm install method-override
  • 在Express应用中配置中间件:
const methodOverride = require('method-override');
// 允许通过表单字段覆盖请求方法
app.use(methodOverride('_method'));
  • Handlebars模板中编写删除表单:
<form action="/admin-panel/products/delete/{{product._id}}" method="POST">
  <input type="hidden" name="_method" value="DELETE">
  <!-- 若需JWT验证,确保请求头或表单携带令牌 -->
  <button type="submit">删除产品</button>
</form>

表单提交时,method-override会自动将POST请求转换为DELETE请求,匹配你的路由。

2. 异步AJAX请求方式

如果需要无刷新删除,可使用Fetch/Axios发送DELETE请求:

Fetch示例代码:

async function deleteProduct(productId) {
  try {
    const response = await fetch(`/admin-panel/products/delete/${productId}`, {
      method: 'DELETE',
      headers: {
        'Authorization': `Bearer ${localStorage.getItem('jwtToken')}` // 携带JWT令牌
      }
    });
    if (response.ok) {
      window.location.href = '/admin-panel/products'; // 删除成功后跳转
    } else {
      const errData = await response.json();
      console.error('删除失败:', errData);
    }
  } catch (err) {
    console.error('请求出错:', err);
  }
}

Handlebars模板绑定点击事件:

<button onclick="deleteProduct('{{product._id}}')">删除产品</button>

3. 临时兼容方案(不推荐)

若需快速测试,可添加GET路由,但这违反RESTful设计,易引发误操作(如爬虫触发删除):

router.get('/admin-panel/products/delete/:id',verifyJWT,getInfo,deleteProduct);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:30:59