Reputation: 13
I'm new to NodeJs and Express. Sorry if I'm asking in a wrong way. I've got a blockchain application using solidity and NodeJs. I got a problem with NodeJs part which is use to make a CRUD. But i always get an error 'Cannot POST' and in my console its show 'POST 404 (Not Found). Seems like my HTML form cannot find the POST route in NodeJs, Im not sure. Please help, thanks.
HTML
<form action="/elections/add" method="post">
<div class="row">
<div class="col-lg-12">
<div class="card mb-4">
<div class="card-header">
New Election
</div>
<div class="card-body">
<div class="form-group">Election Name
<input type="text" class="form-control form-control-user"
id="election_name" name="election_name">
</div>
</div>
</div>
</div>
</div>
<!-- Content Row -->
</div>
</form>
routes/regElections.js
var express = require('express');
var router = express.Router();
var dbConn = require('../lib/db');
// add a new
router.post('/add', function(req, res, next) {
let election_name = req.body.election_name;
let errors = false;
if(election_name.length === 0) {
errors = true;
// set flash message
req.flash('error', "Please enter election name");
// render to add.ejs with flash message
res.render('elections/add', {
election_name: election_name
})
}
// if no error
if(!errors) {
var form_data = {
election_name: election_name
}
// insert query
dbConn.query('INSERT INTO election SET ?', form_data, function(err, result) {
//if(err) throw err
if (err) {
req.flash('error', err)
// render to add.ejs
res.render('elections/add', {
election_name: form_data.election_name
})
} else {
req.flash('success', 'Election successfully added');
res.redirect('/elections');
}
})
}
})
app.js
[enter image description here][1]var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var flash = require('express-flash');
var session = require('express-session');
var mysql = require('mysql');
var connection = require('./lib/db');
var elecRouter = require('./routes/regElections');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
cookie: { maxAge: 60000 },
store: new session.MemoryStore,
saveUninitialized: true,
resave: 'true',
secret: 'secret'
}))
app.use(flash());
//app.use('/', indexRouter);
//app.use('/users', usersRouter);
app.use('/regElections', elecRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
Upvotes: 1
Views: 1723
Reputation: 47
CANNOT POST 404 happens when there is something wrong in your route mainly due to naming problem. I think you are making post request on route /elections/add in html form. and in node.js file your route is /regElections/add.
So in your HTML form shoule look like this: action="/regElections/add"
Upvotes: 1