Solution 1 :

this is the whole idea:

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

const router = require("./router")

app.use(express.static("public"))
app.use(express.urlencoded({extended: false}))
app.use(express.json())

app.use('/', router) // write all your routes in this file 'router'

module.exports = app

Solution 2 :

You need to render the HTML file in your server on port ‘3000’. I think you are trying to access ‘http://localhost:3000/registerauth‘ directly while rendering the html page outside the server.

Make these changes to App.js file

const express = require('express');
const app= express();
const path = require('path');
const port = process.env.PORT || 3000;
const login = require('./routes/login'); /*MODULE THAT HAS THE CONTROLLER CODE*/

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

//newly added code
app.get('/',(req,res)=>{
    res.sendFile('index.html');

})

app.post('/registerauth',function (req,res,next){  /*TRIED THIS BUT DIDN'T WORK*/
    console.log("testing");
    res.json(req.body);
    // Redirect to '/login' here instead of sending response which will trigger the login module
})

app.use('/login', login); /*TRIED CALLING THE MODULE THAT HAS THE CONTROLLER AND DELETING THE LINE ABOVE BUT DIDN'T WORK*/

app.listen(port, ()=> console.log(`server started on port ${port} `))

Render the html page when you hit ‘http://localhost:3000‘. Also, inorder for your login component to work you need to redirect to ‘/login/’ path in the POST request

Problem :

I am new learning NodeJS + Express and now I am trying to build a simple register form but I keep getting the same error with this and other forms:

Cannot POST /registerauth

I have looked through dozens of similiar questions in stackoverflow and other sites but I have not found an answer that applies for my case.

Here is the form:

<form id="register-form" class="panel-form" action="/registerauth" method="POST">
          <input type="text" name="register-username" id="register-username" class="fill-input" placeholder="Username *" autofocus="true" maxlength="15" required>

          <input type="password" name="register-password" id="register-password" class="fill-input" placeholder="Password *" maxlength="30" required>


                        <button type="submit">Register</button>
                    </form>

My app.js file:

const express = require('express');
const app= express();
const path = require('path');
const port = process.env.PORT || 3000;
const login = require('./routes/login'); /*MODULE THAT HAS THE CONTROLLER CODE*/

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname , 'public')));

app.post('/registerauth',function (req,res,next){  /*TRIED THIS BUT DIDN'T WORK*/
    console.log("testing");
    res.json(req.body);
})

app.use('/login', login); /*TRIED CALLING THE MODULE THAT HAS THE CONTROLLER AND DELETING THE LINE ABOVE BUT DIDN'T WORK*/

app.listen(port, ()=> console.log(`server started on port ${port} `))

The module that has the controller code but it’s not even called :

const express    = require('express');
const oracledb    = require('oracledb');
const router        = express.Router();
const dbConfig =require('../dbconfig.js') ;

class Cliente{
    constructor(username,password,nombre,email){
        this.username = username;
        this.password=password;
        this.nombre=nombre;
        this.email=email;
    }
}

    let conexion;

    router.post('/registerauth',async(req,res,next)=>{ /*all this is not working neither*/

        try{
            console.log("THIS IS NOT WORKING");

            cliente = new Cliente(req.body.username, req.body.password,req.body.nombre,req.body.email);

     conexion= await oracledb.getConnection(dbConfig);
     const result = await conexion.execute(
        `INSERT INTO Cliente values (${cliente.username}, ${cliente.password},
 ${cliente.nombre}, ${cliente.email})`
     );
} catch(err){
    console.error(err);
}finally{
    conexion.close();
}
    })

module.exports = router;

And I have my project folder structured this way:

/
 node_modules
 public/
       css/
       media/
       scripts/
       index.html (just the file inside public folder)
       register.html (just the file inside public folder THIS IS THE REGISTER FORM FILE)
 routes/
       api/
          login.js
 app.js
 dbconfig.js
 package-lock.json
 package.json

Note: I created other forms in my project with different action methods and all of them gave the same error

Comments

Comment posted by mgarcia

Hi @Runsis, are you seeing in console the string

Comment posted by Runsis

@mgarcia hi, I am not seeing any console message in the terminal nor in the browser console. And I am starting my node server with nodemon app.js and that works, it loads the templates for example but it is not working with what I asked :/

Comment posted by Luke

You defined two routes in your code, one in

Comment posted by doc

Some important comments on the code: For a web app, you should use a connection pool for performance and scalability. For SQL statements you MUST use bind variables for security (and scalability) instead of

Comment posted by Runsis

what do you mean by that? Wouldn’t this be like the same but more modular?

Comment posted by gtsatars

first of all you should make your project structure even more organized. create separate files with distinct responsibilities. create a file for routes and another one for database connection. then create folders for models, controllers and views. I think your app could not find proper modules and it seems a bit complicated for yourself to require proper modules.

By