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

XMLHttpRequest PUT请求失效:NODEJS API无法接收请求

解决Node.js API PUT请求无响应的问题

嘿,我帮你排查了下代码里的问题,这几个点应该就是导致PUT请求没被正确处理的原因:

1. 请求头设置时机错了!

你在xhr.open()之前就调用了xhr.setRequestHeader(),这不符合浏览器的XMLHttpRequest规范——请求头必须在调用open()之后、send()之前设置。提前设置的话,浏览器会直接忽略这个请求头,服务器就没法正确识别你发的JSON格式请求体,甚至可能导致请求根本发不出去。

2. 服务器端响应逻辑有多重响应风险

你的PUT接口里,if (error)和if (result.changedRows == 0)之后都没加return,这会导致就算已经给客户端发了错误提示或者“未修改”的响应,代码还会继续往下执行到res.json(req.params.Id),尝试再次发送响应。Node.js不允许同一个请求多次响应,这会触发内部错误,直接导致请求异常中断。

3. 前端参数类型不匹配(潜在坑)

你前端的Prezzo是数字输入框,但用value拿到的是字符串类型,而数据库里的Prezzo应该是数值类型。虽然MySQL会自动转换,但显式转成数字能避免一些奇怪的类型错误。


修改后的客户端UpdateProdotti函数

function UpdateProdotti() {
  var id = document.getElementById("Mid").value;
  var descrizione = document.getElementById("Mdescrizione").value;
  // 把价格转成数字类型
  var prezzo = parseFloat(document.getElementById("Mprezzo").value);
  var categoria = document.getElementById("Mcategoria").value;

  const data = {
    Descrizione: descrizione,
    Prezzo: prezzo,
    Categoria: categoria
  };
  
  const xhr = new XMLHttpRequest();
  // 先打开请求连接
  xhr.open("PUT", "api/prodotti/" + id, true);
  // 再设置请求头,顺序不能乱
  xhr.setRequestHeader('Content-type','application/json; charset=utf-8');
  
  xhr.onload = function () {
    if (this.readyState == 4) {
      if (this.status == 200) {
        alert("Modificato " + xhr.responseText);
      } else {
        // 新增错误状态的提示,方便排查
        alert("Errore durante la modifica: " + xhr.responseText);
      }
    }
  };
  // 加上请求发送失败的处理
  xhr.onerror = function() {
    alert("Impossibile connettersi al server");
  };
  
  xhr.send(JSON.stringify(data));
}

修改后的服务器端PUT接口代码

app.put('/api/prodotti/:Id', function (req, res) {
  connection.query(
    "UPDATE Prodotti SET Descrizione=?, Prezzo=?, Categoria=? WHERE Id=?",
    [req.body.Descrizione, req.body.Prezzo, req.body.Categoria, req.params.Id],
    function (error, result) {
      if (error) {
        console.error("Errore query: ", error.message);
        // 返回500错误码并终止后续代码
        return res.status(500).send("Errore query: " + error.message);
      }
      if (result.changedRows == 0) {
        // 返回404状态码,明确告知客户端没找到或没修改
        return res.status(404).send("Non modificato! Nessun record trovato o nessun cambiamento");
      }
      console.log("Id modificato: " + req.params.Id);
      res.json(req.params.Id);
    }
  );
});

额外要检查的点

  • 确保你的Node.js项目里已经加了JSON解析中间件:app.use(express.json())。如果没加的话,服务器根本解析不了你发的JSON请求体,req.body会是undefined,这也会导致PUT请求看似没被处理。
  • 打开浏览器开发者工具(按F12),切换到Network标签,看看PUT请求的状态码、请求头和请求体,确认请求是不是真的发出去了,格式对不对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:58:10