Cannot POST / error using express

Viewed 155206

I am trying to create a simple form handler using express. I tried the code below for my form:

<form class="form"  action="/" method="post" name="regForm">              
    <div class="form-group">
        <input type="text" name="username" class="form-control" id="username" placeholder="Username">
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>

And here is my app.js code:

const port = 3000;

var express = require('express'),
    app = express(),
    server = require('http').createServer(app);
var bodyParser = require('body-parser');

app.use(express.static(__dirname + '/public'));

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

app.use(bodyParser.json());

app.post('/',function(req,res){
   var username = req.body.username;
   var html = 'Hello:' + username;
   res.send(html);
   console.log(html);
});

server.listen(port);

I keep getting the error "CANNOT POST /" after submitting the form. Am I missing something like a module?

6 Answers

In my case, I wasn't paying attention to the url I was posting from.

I had the page login http://localhost:5000/login which was posting and, if successful, renders the page account http://localhost:5000/account.

But, playing few times with these 2 pages, the link remained at http://localhost:5000/account but displayed the login page. So, when I was clicking the log in button which had a form with method = "post", I was getting the error Cannot POST /account.

So the fix was to correctly render the login page, by typing in the url of login page http://localhost:5000/login.

Another Way is that we can use .route method provided by express

https://expressjs.com/en/guide/routing.html

Eg:

app.route("url")
   .get(function())

   .post(function());

remember to close the .route function using semi colon ;

You should call router instead of app
const router = express.Router();

router.use(bodyParser.urlencoded({ extended: false }));

router.post('/',function(req,res){
   var username = req.body.username;
   var htmlData = 'Hello:' + username;
   res.send(htmlData);
   console.log(htmlData);
});

Check for any trailing whitespace in your path strings. Sounds super simple but it took me two days to figure this was even possible. It seems that if your paths look like this

router.post('/foo ', (req, res)=> { // I hope you see it!
    res
        .status(200)
        .send({msg: 'Foo!'})
})

Instead of this

router.post('/foo', (req, res)=> {
    res
        .status(200)
        .send({msg: 'Foo!'})
})

You will get the "Cannot METHOD /PATH" error. It just so happens the browser is nice enough to truncate the trailing whitespace in it's error message as to not inconvinience you with unecessary information.

Stay safe kids, use "highlight whitespaces" in your editors for your own sanity.

Related