Home  >  Q&A  >  body text

Unable to send data from axios to node server returning empty object

My client code:

<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="form.css" />
  </head>
  <body>
    <form action="/login" method="post" class="form">
      <input type="text" name="txt" class="txt" id="txt" placeholder="name" />
      <input type="submit" class="submit" id="submit" />
    </form>
    <script defer src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
      let submit = document.querySelector(".submit");
      const form = document.querySelector(".form");

      form.addEventListener("submit", (e) => {
        e.preventDefault();

        const formData = new FormData(form);

        const formObject = {};
        formData.forEach((value, key) => {
          formObject[key] = value;
        });

        console.log(axios.defaults)

        axios
          .post("http://localhost:8080/login", formObject)
          .then(function (response) {
            console.log(response.data);
          })
          .catch(function (error) {
            console.log(error);
          });
      });
    </script>
  </body>
</html>

My server side code:

const app = express();
const path = require("path");

app.use(express.static('./public',{index:'form.html'}));

app.use(express.urlencoded({extended:true}));

    app.post('/login',(req,res)=>{
    //const txt = req.body;
      console.log('logged data: ',req.body);
      res.send('Thanks');
    })
app.listen(8080, () => {
  console.log('server is running...in port 8080')

 });

First of all please keep in mind that I am new to backend. When I try to console.log the logged data, it returns an empty object, I can't understand why my req.body returns an empty object, but when I try to do the same by giving action:"/login" and the method When: "post" inside the form tag it works as expected and gives me the input I provide. Please someone help me, my head is burning, thank you in advance.

P粉141911244P粉141911244183 days ago2494

reply all(1)I'll reply

  • P粉333186285

    P粉3331862852024-04-01 09:14:42

    req.body is empty because when you send it using axios you are actually sending a JSON (application/json) payload , and the backend doesn't have a JSON payload parser, only URL encoding, and the HTML form sends it in application/x-www-form-urlencoded format, that's why it works.

    Therefore, you need to use axios to send URL-encoded requests, which you can do by using URLSearchParams to convert the JSON object into a query string. Try this.

    axios
      .post("http://localhost:8080/login", new URLSearchParams(formObject))

    Alternatively, just add a JSON parser to the backend and your raw JSON requests will work, using the built-in parser:

    app.use(express.json());

    reply
    0
  • Cancelreply