Search code examples
javascriptnode.jsexpressaxiosmern

Axios sending 404 error possible reasons or fixes?


hey I'm very new to MERN stack and I'm having an issue posting data with Axios and express. I might have understood this wrong but here goes my problem. I have a form on a page which I'm trying to submit data from to the backend where I then console log it. the page is a component which contains the onsubmit function, which sends a post request to server.js which then console.logs it, however I've been getting an ERROR 404 on submitting. Dependencies should be installed correctly

This is my on submit function

    onSubmit(e) {
        e.preventDefault();
        
        console.log(`Form submitted:`);
        console.log(` ${this.state.searchquery}`);
        
        const newSearchQuery = {
            searchquery: this.state.searchquery,
        };

        axios.post('http://localhost:3000/', newSearchQuery)
            .then(res => console.log(res.data)).then( 
                (response) => { console.log(response) },
                (error) => { console.log(error) }
            );;
        
        this.setState({
            searchquery: '',

        })
    }

this is the server.js file

const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const todoRoutes = express.Router();
const PORT = 3000;


app.use(cors());
app.use(bodyParser.json());


todoRoutes.route('/').post(function(req, res) {
    console.log(req.body);
});

app.listen(PORT, function() {
    console.log("Server is running on Port: " + PORT);
});```

Solution

  • App is not configured to use the routes and that's why it throws a 404.

    Use this line after todoRoutes.Route():

    app.use(todoRoutes);
    

    app.use() is used to register middlewares to the main node app. Since you are using router express middleware, you need to register it as well.

    EDIT: This works for me. In case you want the complete code:

    ReactJS:

    import React from "react";
    import axios from 'axios';
    
    class App extends React.Component {
      constructor() {
        super();
        this.state = {
          searchquery: ''
        };
      }
      handleChange = (e) => {
        this.setState({ searchquery: e.target.value });
      }
      onSubmit = (e) => {
        e.preventDefault();
        
        console.log(`Form submitted:`);
        console.log(` ${this.state.searchquery}`);
        
        const newSearchQuery = {
            searchquery: this.state.searchquery,
        };
    
        axios.post('http://localhost:3000/', newSearchQuery)
            .then(res => console.log(res.data)).then( 
                (response) => { console.log(response) },
                (error) => { console.log(error) }
            );;
        
        this.setState({
            searchquery: '',
        })
      }
      render() {
        return (<form onSubmit={this.onSubmit}>
          <input type="text" value={this.state.searchquery} name="searchquery" id="searchquery" onChange={this.handleChange} />
          <button type="submit">Submit</button>
        </form>);
      }
    }
    
    export default App;
    

    Express code:

    const express = require("express");
    const app = express();
    const bodyParser = require('body-parser');
    const cors = require('cors');
    const todoRoutes = express.Router();
    const PORT = 3000;
    
    
    app.use(cors());
    app.use(bodyParser.json());
    
    
    todoRoutes.route('/').post(function(req, res) {
        console.log(req.body);
    });
    
    app.use(todoRoutes);
    
    app.listen(PORT, function() {
        console.log("Server is running on Port: " + PORT);
    });