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

为何Postman中DELETE方法测试正常,浏览器却无法识别?

问题:浏览器中HTTP DELETE请求失败,Postman正常,无需改为GET的解决办法

我发现HTTP DELETE请求在Postman中测试完全正常,但在浏览器中测试时收到Cannot GET /account/delete/Julieth错误。改为GET方法后可在两个环境正常运行,已配置跨源请求,想了解浏览器对DELETE方法的限制,以及无需改为GET的解决办法。

我的代码如下:

var express = require("express");
var app = express();
var cors = require("cors");

var bodyparser = require("body-parser");
app.use(bodyparser.urlencoded({ extended: true }));
app.use(bodyparser.json({ limit: "10mb" }));

// 托管静态文件
app.use(express.static("public"));
app.use(cors());

let users = [
  {
    name: "Julieth",
    lastName: "Bautista",
    Email: "julieth@mit.edu",
    password: "bigsecret",
    balance: 0,
  },
  {
    name: "Jose",
    lastName: "Bautista",
    Email: "jose@mit.edu",
    password: "secret",
    balance: 233,
  },
];

// 创建用户路由(GET仅用于获取数据,此处实现不规范)
app.get(
  "/account/create/:name/:lastname/:email/:password/:balance",
  function (req, res) {
    res.send({
      name: req.params.name,
      lastName: req.params.lastname,
      email: req.params.email,
      password: req.params.password,
      balance: req.params.balance,
    });
  }
);
// 登录路由(GET仅用于获取数据,此处实现不规范)
app.get("/account/logIn/:email/:password", function (req, res) {
  res.send({
    email: req.params.email,
    password: req.params.password,
  });
});

app.get("/account/all", function (req, res) {
  res.send(users);
});

// 创建用户(POST用于产生状态变更)
app.post("/account", function (req, res) {
  var balance = req.body.balance;
  const user = req.body.name;
  const password = req.body.password;
  users.push({ name: user, password: password, balance: balance });
  res.send(users);
  console.log("balance:" + balance);
});

// 取款(PUT用于替换资源表示)
app.put("/account/withdraw", (req, res) => {
  console.log(users);
  const newArray = users.map((user) => {
    if (user.name == req.body.name && user.password == req.body.password) {
      if (user.balance == 0) return;
      else {
        newBalance = user.balance - req.body.balance;
        user.balance = newBalance;
        let myUser = user;
        let updatedUser = { balance: newBalance, ...myUser };
        user = updatedUser;

        return user;
      }
    }
    return users;
  });

  res.send(users);
});

// 存款(PUT用于替换资源表示)
app.put("/account/deposit", (req, res) => {
  console.log(users);
  const newArray = users.map((user) => {
    if (user.name == req.body.name && user.password == req.body.password) {
      newBalance = req.body.balance + user.balance;
      user.balance = newBalance;
      let myUser = user;
      let updatedUser = { balance: newBalance, ...myUser };
      user = updatedUser;

      return user;
    }
    return users;
  });

  res.send(users);
});

// GET方法删除资源(临时可用,但不符合REST规范)
app.get("/account/delete/:name", function (req, res) {
  console.log(users);
  let filteredArray = users.filter((user) => user.name !== req.params.name);
  users = filteredArray;
  res.send(users);
  res.sendStatus(204);
});

// DELETE方法删除资源(浏览器中无法正常触发)
app.delete("/account/delete/:name", function (req, res) {
  console.log(users);
  let filteredArray = users.filter((user) => user.name !== req.params.name);
  users = filteredArray;
  res.sendStatus(204);
});

app.listen(3000, function () {
  console.log("运行在3000端口!");
});

解答

错误原因

浏览器直接在地址栏输入URL、或使用未指定方法的HTML表单时,默认只会发送GET请求。你看到的Cannot GET错误,说明你在浏览器中根本没发送DELETE请求,自然匹配不到后端定义的app.delete路由。而Postman可以手动指定请求方法,直接发送DELETE请求,所以能正常命中路由。

无需改为GET的解决办法

1. 用JavaScript发送DELETE请求(推荐)

在前端页面中使用fetch或axios工具主动发送DELETE请求,示例如下:

使用fetch:

// 删除名为Julieth的用户
fetch('/account/delete/Julieth', {
  method: 'DELETE',
  headers: {
    'Content-Type': 'application/json'
  }
})
.then(response => {
  if (response.ok) {
    console.log('删除成功');
    // 这里可以更新页面数据,比如重新获取用户列表
  } else {
    console.error('删除失败');
  }
})
.catch(error => console.error('请求出错:', error));

使用axios:

axios.delete('/account/delete/Julieth')
.then(response => {
  console.log('删除成功');
})
.catch(error => {
  console.error('删除失败:', error);
});

2. 确保CORS配置正确处理预检请求

虽然你已经配置了cors中间件,但如果是跨域场景,要确保它允许DELETE方法的预检(OPTIONS)请求。当前app.use(cors())默认允许所有跨域请求,若后续有自定义配置,需明确包含DELETE方法:

app.use(cors({
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
}));

3. 修复后端代码的响应问题

你的GET删除路由中同时调用了res.send(users)和res.sendStatus(204),这会导致错误——响应只能发送一次。需二选一:

app.get("/account/delete/:name", function (req, res) {
  console.log(users);
  let filteredArray = users.filter((user) => user.name !== req.params.name);
  users = filteredArray;
  // 要么返回数据
  res.send(users);
  // 要么返回状态码(符合REST规范的删除操作通常返回204)
  // res.sendStatus(204);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:07:09