【问题标题】:React Hooks: How to make a POST request to serverReact Hooks:如何向服务器发出 POST 请求
【发布时间】:2020-09-11 03:52:28
【问题描述】:

我是初学者。我正在尝试以简单的形式从 React.js 实现 POST 请求,但我不知道如何将 POST 请求发送到数据库。我想我也需要<form action="URL">。 任何帮助将不胜感激。 下面是来自 React.js(frontend) 的代码

import GameTestResult from './GameTestResult';

export default function App() {
 const[data, setData] = useState([]);
 const [formData, setFormData] = useState("");

 useEffect (() => {
  fetch('http://localhost:3000/game')
  .then(res => res.json()) 
 .then(result => setData(result.rows))
  .catch(err => console.log("error"))
  },[]);

  const handleChange = event => {
    setFormData(event.target.value)
    }
    
    const eventHandler = event => {
      event.preventDefault();
      setFormData("");
    }

  return (
    <div className="App">
        <form  method="post" onSubmit = {eventHandler}>
          <input value = {formData} onChange = {handleChange} />
          <button type="submit">click</button>
        </form>
      
      {data && data.map((element, index)=>(
            <GameTestResult
              name = {element.name}
              key={element.index}
            />
      ))} 

      </div>
  );
}

这里是 express.js(backend) 的代码

var router = express.Router();
const pool = require("../config.js");
var cors = require('cors');



router.get("/game", cors(), (req, res) => {
  pool
    .query("SELECT * FROM game")
    .then((data) => res.json(data))
    .catch((e) => {
      res.sendStatus(404), console.log(e);
    });
});



router.post("/game", (req, res) => {
  const { name } = req.body; 
 
  pool
    .query('INSERT INTO game(name) values($1);', [name])
    .then(data => res.status(201).json(data))
    .catch(e => res.sendStatus(404));
 });
 

module.exports = router;

【问题讨论】:

  • 是的,API 有效。我没有错误,当我通过 Postman 进行测试时,Post 请求在后端工作。现在我无法使用 React.js 在 Form 中进行 Post 请求。在此代码中我没有错误,但单击表单“单击”按钮后未填充数据库
  • 后端在 5000 端口,前端在 3000 端口,工作正常
  • API 调用正确,我至少可以在 React.js 中显示 GET 请求
  • 究竟是什么问题?你能发出 GET 请求,但不能发出 POST 请求吗?下面的答案对你有用吗?
  • 是的,这是我的问题。而且我不明白,他下面的“事件目标键”表达式是什么意思

标签: node.js reactjs express


【解决方案1】:
  • 将名称添加为"name" 输入
  • 监听 onChange 并设置数据setFormData({[event.target.key]: event.target.value}) 数据将是例如{name: "Tony"}
  • 在按钮的 onClick 操作上调用 POST 请求,如下代码所示
  • JSON.stringify(data) 在将 js 对象发送到服务器时将其转换为 JSON 很重要
import GameTestResult from './GameTestResult'

export default function App() {
  const [data, setData] = useState([])
  const [formData, setFormData] = useState({})

  useEffect(() => {
    fetch('http://localhost:3000/game')
      .then((res) => res.json())
      .then((result) => setData(result.rows))
      .catch((err) => console.log('error'))
  }, [])

  const handleChange = (event) => {
    setFormData({ [event.target.name]: event.target.value })
  }

  const eventHandler = (event) => {
    fetch('http://localhost:3000/game', {
      method: 'POST',
      body: JSON.stringify(formData),
    })
      .then((res) => res.json())
      .then((result) => {
        console.log(result)
        setFormData('')
      })
      .catch((err) => console.log('error'))
  }

  return (
    <div className="App">
      <form>
        <input name="name" value={formData.name || ''} onChange={handleChange} />
        <button onClick={eventHandler}>click</button>
      </form>

      {data &&
        data.map((element, index) => (
          <GameTestResult name={element.name} key={element.index} />
        ))}
    </div>
  )
}

【讨论】:

  • 感谢您的回复。我不明白这部分 ---> setFormData({[event.target.key]: event.target.value})。请解释一下好吗?
  • &lt;input name="name" value = {formData} onChange = {handleChange} /&gt;handleOnchange 被触发时,你会得到一个event,我们将有event.target 是一个具有输入元素属性的对象。对于这个输入,我们有 event.target.key"name"event.target.value 是用户输入的任何字符串。然后,{[event.target.key]: event.target.value} 将变为 {name: "the string user type}。然后将其设置为formData
  • 是的,我尝试过这种方式,但这不允许我输入输入,因为当我尝试输入时,现在里面是 '[object Object]' 。并将空行发送到数据库
  • 对不起,event.target.key 应该是 event.target.name&lt;input name="name" value = {formData} onChange = {handleChange} /&gt; 应该是 &lt;input name="name" value = {formData.name || "} onChange = {handleChange} /&gt;{formData.name || "} 表示是否有 name property in formData` 对象显示 name 如果未定义则显示为空。我更新了我的评论,请查看更新信息
  • @Gregfan。我很高兴它有帮助。如果它真的对你有帮助,请给它投票。
【解决方案2】:

你可以这样做:

在安装组件时获取游戏。并在提交表单时提交新游戏。

export default function App() {
  const [data, setData] = useState([])
  const [formData, setFormData] = useState('')

  useEffect(() => {
    fetchGames() // Fetch games when component is mounted
  }, [])

  const fetchGames = () => {
    fetch('http://localhost:3000/game', {
      method: 'GET',
    })
      .then((res) => res.json())
      .then((result) => setData(result.rows))
      .catch((err) => console.log('error'))
  }

  const saveGames = () => {
    fetch('http://localhost:3000/game', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        name: formData, // Use your own property name / key
      }),
    })
      .then((res) => res.json())
      .then((result) => setData(result.rows))
      .catch((err) => console.log('error'))
  }

  const handleSubmit = (event) => {
    event.preventDefault()
    saveGames() // Save games when form is submitted
  }

  const handleChange = (event) => {
    setFormData(event.target.value)
  }

  return (
    <div className="App">
      {/* method="post" not needed here because `fetch` is doing the POST not the `form` */}
      {/* Also, note I changed the function name, handleSubmit */}
      <form onSubmit={handleSubmit}>
        <input type="text" name="name" value={formData} onChange={handleChange} />
        <button type="submit">click</button>
      </form>

      {data &&
        data.map((element, index) => (
          <GameTestResult name={element.name} key={element.index} />
        ))}
    </div>
  )
}

您可以阅读 this 了解如何使用 fetch 和 this 了解表单如何在 RecatJS 中工作。

【讨论】:

  • 另外,您应该考虑使用 axios 而不是 fetch。 Axios 在旧浏览器上也能更好地工作。见this
  • 谢谢。老实说,我以前没用过,但也会学习
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
相关资源
最近更新 更多