Question/Problem
My req.body
is undefined when I post form data... This is strange because I have multiple other pages with forms where I post data the same way but all of a sudden I am getting this issue and I do not know why. This does seem to be a common problem but I can't find a fix that works for me.
What I have tried so far...
- Checked console.log(req.is('json')) but it is false and I do not know what to do with this information - I feel like this might be the source of my problem. It doesn't look like I can set form data to json
- I have other forms which I coded in a similar manner that work
- Included 'body-parser'/app.use(bodyParser.json());... see the above point
- Tried using app.use(bodyParser.json({ type: 'application/vnd.api+json' }));
- Made sure I have a name property for each input field
- EDIT: app.use(bodyParser.urlencoded()); does not work
Code
<form action="/changePassword" method="post" onsubmit="event.stopPropagation(); return passwordChange(this);" enctype="application/x-www-form-urlencoded" novalidate="">
<input id="password1" placeholder="password" name="password1" maxlength="30" class="form-control input-sm chat-input" type="password">
<input id="password2" placeholder="confirm password" name="password2" maxlength="30" class="form-control input-sm chat-input" type="password">
<input id="changePassword" value="Change Password" type="submit">
</form>
app.post('/changePassword', users.changePassword);
module.exports.changePassword = function(req, res){
console.log(req.is('json')); // false and req.body is undefined
...
...
res.redirect('/');
});
Let me know if additional code is needed.
EDIT: Not sure if this is worth mentioning but I had other problems which again I did not have with other pages. When I was trying to validate the passwords, return false;
would not prevent the page from posting/executing. I had to include event.stopPropagation()
.
Additional Code:
./bin/www
!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('app:server');
var http = require('http');
var express= require('express');
/**
* Get port from environment and store in Express.
*/
var port = parseInt(process.env.PORT, 10) || 3000;
app.set('port', port);
/**
* Create HTTP server.
*/
// var server = http.createServer(app);
//var server = app;
/**
* Listen on provided port, on all network interfaces.
*/
app.use((err, req, res, next) => {
console.log(err.stack || err.message);
if (res.headersSent)
return next(err)
res.status(500).send('Internal Server Error')
})
app.listen(port);
app.on('error', onError);
app.on('listening', onListening);
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error('Port ' + port + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error('Port ' + port + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
debug('Listening on port ' + server.address().port);
}
app.js
/*jslint node:true */
/*global $, jQuery, alert*/
"use strict";
var express = require('express');
var path = require('path');
var fs = require('fs');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var expressSession = require('express-session');
var mongoose = require('mongoose');
var mongoStore = require('connect-mongo/es5')({ session: expressSession });
var passport = require('passport');
var debug = require('debug')('app:server');
var uriUtil = require('mongodb-uri');
var mongodb = require('mongodb');
var MongoClient = mongodb.MongoClient;
var assert = require('assert');
mongoose.Promise = global.Promise;
var MONGOLAB_URI = ****;
var mongooseUri = uriUtil.formatMongoose(MONGOLAB_URI);
var mongoConnection = mongoose.connect(MONGOLAB_URI, function (err, db) {
if (err) {
console.log('Unable to connect to MongoDB: ', err);
} else {
console.log('Connection has been established...');
}
});
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
console.log("__dirname: " + __dirname);
app.use(expressSession({
secret: 'RCNEfyBUAcHnPeQxFWyBTr',
cookie: { maxAge: 60*60*1000 },
resave: true,
saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());
require('./routes/index')(app, conn);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
exports.mongoConnection = mongoConnection;
index.js
module.exports = function (app, conn) {
...
app.post('/signup', users.signup);
app.post('/login', users.login)
app.post('/changePassword', users.changePassword);
app.post('/password', users.password); // send new password
app.post('/user/create_test', users.create_test);
app.post('/user/calculatesubjects', users.calculate_subjects);
app.post('/user/calculatetopics', users.calculate_topics);
app.post('/test/:username/:testid/:noq/:quesnum', users.answer_selected);
// Admin posts
app.post('/admin/update_subjects_topics', admin.update_subjects_topics);
app.post('/admin/add_question', admin.add_question);
}
passwordChange function
function passwordChange(form)
{
if(form.password1.value != "" && form.password1.value == form.password2.value) {
if(form.password1.value.length < 6) {
alert("Error: Password must contain at least six characters!");
form.password1.focus();
return false;
}
re = /[a-z]/;
if(!re.test(form.password1.value)) {
alert("Error: password must contain at least one lowercase letter (a-z)!");
form.password2.focus();
return false;
}
} else {
alert("Error: Please check that you've entered and confirmed your password!");
form.password2.focus();
return false;
}
return true;
}