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

axios.put()无法更新SQL Server数据库问题求助

问题

连接Node.js后端的React页面,通过axios.put()提交用户输入更新数据库时,前端返回200 OK但数据库仅被更新为NULL;使用Postman发送相同请求却能正常更新,控制台无报错且输出看似正常。

前端代码(App.js)

import React, { useState, useEffect } from 'react'
import axios from 'axios'
import './App.css';

function App() {

  const [orderNumber, setOrderNumber] = useState(0);
  const [input, setInput] = useState('');
  const [data, setData] = useState([]);

  const url = `http://localhost:8080/api/event/${orderNumber}`
  useEffect(() => {
    axios.get(url)
    .then(response => {
      setData(response.data)
      console.log(response.data)
    })
    .catch((err) => console.log(err));
  }, [url]);

  const handleChange = event => {
    setOrderNumber(event.target.value);
    //console.log(event.target.value);
  };

  const handleClick = event => {
    event.preventDefault();
    console.log(orderNumber);
  }

  const handleUpdate = event => {
    event.preventDefault();
    console.log(`Event ID : ${event.target.id}`);
    console.log(input);
    axios.put(`http://localhost:8080/api/event/${event.target.id}` , input)
      .then((response) => {
        if (response.status === 200) {
          alert("Comment Successfully Updated!")
        } else Promise.reject();
      })
      .catch((err) => alert(`Something went wrong : ${err}`));
    }

  return(
    <div>
        <br></br>
        <br></br>
        Order Number: <input placeholder="Order Number" type="text" id="message" name="message" onChange={handleChange} value={orderNumber} autoComplete="off" />
        <button onClick={handleClick}>Search</button>
        <br></br>
        <br></br>
                {data.map((alldata) => (
                    <div key={alldata.ID}> 
                    <input id={alldata.ID} defaultValue={alldata.cmt} onChange={e => setInput(e.target.value)}/> 
                    <button id={alldata.ID} onClick={handleUpdate}>Update</button>
                    </div>
                ))} 
                
    </div>
)
}

export default App;

解决方案

1. 单一输入状态导致多输入框数据冲突

当前所有输入框共享同一个input状态,当页面渲染多条数据时,编辑A输入框后再点击B输入框的更新按钮,input值可能不是B的内容,甚至为空,导致后端接收空值更新为NULL。

修复:给每条数据维护独立的输入状态,修改如下:

// 初始化数据时添加独立输入字段
useEffect(() => {
  axios.get(url)
  .then(response => {
    const formattedData = response.data.map(item => ({
      ...item,
      inputValue: item.cmt // 用原评论值初始化输入框
    }));
    setData(formattedData);
  })
  .catch((err) => console.log(err));
}, [url]);

// 针对具体ID更新输入值
const handleInputChange = (id, value) => {
  setData(prevData => prevData.map(item => 
    item.ID === id ? {...item, inputValue: value} : item
  ));
}

2. PUT请求数据格式不匹配后端要求

Postman请求正常说明后端期望接收JSON对象格式,但前端直接传递字符串input,后端无法解析对应字段,导致更新为NULL。

修复:将请求数据包装成后端预期的JSON结构(假设后端接收{cmt: "新内容"}格式),同时优化更新函数:

const handleUpdate = (id, inputValue) => {
  axios.put(`http://localhost:8080/api/event/${id}`, { cmt: inputValue })
    .then((response) => {
      if (response.status === 200) {
        alert("Comment Successfully Updated!");
        // 更新本地状态,避免重新请求
        setData(prevData => prevData.map(item => 
          item.ID === id ? {...item, cmt: inputValue} : item
        ));
      } else Promise.reject();
    })
    .catch((err) => alert(`Something went wrong : ${err}`));
}

3. 修正渲染部分的输入框与按钮

替换原渲染逻辑,绑定独立状态并直接传递ID给更新函数,避免event.target的歧义问题:

{data.map((alldata) => (
  <div key={alldata.ID}> 
    <input 
      id={alldata.ID} 
      value={alldata.inputValue} 
      onChange={e => handleInputChange(alldata.ID, e.target.value)}
    /> 
    <button 
      onClick={() => handleUpdate(alldata.ID, alldata.inputValue)}
    >Update</button>
  </div>
))}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:10:28