为何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
相关产品推荐
相关产品推荐

