Mdurocher
Mdurocher

Reputation: 53

ExpressJS/Mongodb POST request and losing user data

I have a NodeJS app, and I am trying to add a 'New Ticket' feature to my users profile page.

Here is how the flow should work - 1. User submits a request which creates a new ticket in my mongodb 2. the profile page reloads and shows the newly created ticket in the 'Recent ticket' section. (I am having no trouble retrieving the previosuly created tickets)

however when I submit the post request and try to reload the profile page, I lose the user data. (i.e. user is not defined).

router.post('/addTicket',  [
    check('phonenumber', 'user phone number required').not().isEmpty(),
    check('requestDevice', 'A device is required').not().isEmpty(),
    check('userDescription', 'A brief description is required').not().isEmpty(),
], function(req,res,){
    var userDescription = req.body.userDescription;
    var requestDevice     = req.body.requestDevice;
    var phonenumber = req.body.phonenumber;

    const result = validationResult(req);
    var errors = result.errors;

    if (!result.isEmpty()) {
        res.render('profile', {

                errors: errors,
                requestDevice: requestDevice,
                userDescription: userDescription,       
        });
    } else {
        console.log(phonenumber);
        var newTicket = {
            id: Math.random().toString(36).substring(2),
            requestDevice: requestDevice,
            userDescription: userDescription,
            openDate: Date.now(),
            closeDate: "",
            techComment: "",
            status : "open",
        }

        User.updateOne( {phonenumber: phonenumber }, {$push: {"tickets":  newTicket  } }, false, function(err, doc) {
            if(err){
                    res.send(err);
                } else {
                    console.log('ticket Added...');
                    res.redirect('/profile', {user:req.session.user}); //I know this req.session.user usage is probably not correct, but I've just been trying everything.
                }
        });


    }
});

and my console

    ReferenceError: D:\users\admin\desktop\from laptop\itspot.v.1.0.0\views\profile.ejs:59
    57|     <div class="w3-display-container w3-center w3-mobile" style="height: 300px">
    58|         <div class="w3-display-middle w3-card-2 w3-center" style="margin-top: 25px; width: 35%" >
 >> 59|            <h4 class="w3-center">Welcome <%= user.name.fname  %> !</h4>
    60|            <p class="w3-center"><img src="../img/avatar.png" class="w3-circle" style="height:106px;width:106px" alt="Avatar"></p>
    61|            <hr>
    62|            <p> <i class="fa fa-home fa-fw  w3-text-theme"></i> Zip: <%=user.zipcode %> </p>

user is not defined
    at eval (eval at compile (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:633:12), <anonymous>:29:26)
    at returnedFn (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:668:17)
    at tryHandleCache (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:254:36)
    at View.exports.renderFile [as engine] (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\ejs\lib\ejs.js:485:10)
    at View.render (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\view.js:135:8)
    at tryRender (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\application.js:640:10)
    at Function.render (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\application.js:592:3)
    at ServerResponse.render (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\response.js:1012:7)
    at D:\users\admin\desktop\from laptop\itspot.v.1.0.0\routes\users.js:337:11
    at Layer.handle [as handle_request] (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express\lib\router\route.js:137:13)
    at Object.<anonymous> (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express-validator\src\middlewares\check.js:23:13)
    at Generator.next (<anonymous>)
    at fulfilled (D:\users\admin\desktop\from laptop\itspot.v.1.0.0\node_modules\express-validator\src\middlewares\check.js:4:58)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

Here is the profile route

router.get('/profile', ensureAuthenticated, function(req,res){
    res.render('profile');
});

And just for the heck of it, this is my app.js file

var routes = require('./routes/index');
var services = require('./routes/services');
var users = require('./routes/users');
var info = require('./routes/info');
var admins = require('./routes/admins');

var app = express();

db.on('error', console.error.bind(console, 'connection error'));
db.once('open', function () {
  console.log('db is connected');
});

app.use(helmet());
//view engine

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

//set static folder
app.use(express.static(path.join(__dirname, 'public')));
app.use('/css', express.static(__dirname + '/node_modules/w3-css'));
//body parser
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
//Express Session Middleware
app.use(session({
    secret: 'this is super secret meow',
  store: new MongoStore({mongooseConnection: db}),
    saveUninitialized: true,
    resave: true,
  cookie: {
    httpOnly: false,
    secure: false,

  }
}));

//passport middleware
app.use(passport.initialize());
app.use(passport.session());

// Express Validator Middleware
/*app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.'), 
      root    = namespace.shift(),
      formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
 })); */

// Connect-Flash Middleware
app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

//Access Globals
app.get('*', function(req, res, next){
  res.locals.user = req.user || null;
  next();

});



// Define Routes
app.use('/', routes);
app.use('/users', users);
app.use('/services', services);
app.use('/info', info);
app.use('/admins', admins);


app.listen(3000);
console.log('Server started on port 3000');

Adding Mongoose Schema

var mongoose = require('mongoose');

var userSchema = mongoose.Schema({
    name: {
        fname:{type: String, maxlength: 30, minlength: 1 },
        lname: {type: String, maxlength: 30, minlength: 1}
    },

    role: {type: String, default: "user"},

    email: {
        type: String,
        trim: true,
        lowercase: true,
        unique: true,
    },
    phonenumber: { type: String, required: true, validate: /^\d{10}$/, unique: true },
    zipcode: String,
    password: String, 
    devices: [],
    tickets: [],
    creationDate: { type: Date, default: Date.now },
    isVerified: {type: Boolean, default: false},
    passwordResetToken: String,
    PasswordResetExpires: Date,
});


const tokenSchema = mongoose.Schema({
    _userId: {type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User'},
    token: {type: String, required: true},
    createdAt: { type: Date, required: true, default: Date.now, expires: 43200 }
});

const Token = mongoose.model('Token', tokenSchema);
var User = mongoose.model('User', userSchema);

module.exports = {Token, User};

Session Data that gets saved to my database

 db.sessions.find().pretty()
{
        "_id" : "e9bmD-yK2Rsr0fDajeusrtMTCJpUm0pT",
        "expires" : ISODate("2019-11-29T19:49:43.182Z"),
        "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"secure\":false,\"httpOnly\":false,\"path\":\"/\"},\"flash\":{},\"passport\":{\"user\":\"5dccd8041ac5ab2eec6f2be7\"}}" //This is the correct user ID, I checked it against the User id in the db.
}

Upvotes: 0

Views: 111

Answers (2)

Dharmik soni
Dharmik soni

Reputation: 363

User.findOneAndUpdate( {phonenumber: phonenumber }, {$push: {"tickets": newTicket } }, {new: true}, function(err, doc) { if(err){ res.send(err); } else { console.log('ticket Added...', doc, 'this is updated data'); res.redirect('/profile', {user: doc}); 

Upvotes: 0

edwin walela
edwin walela

Reputation: 48

Instead of rendering the view try redirecting to the /profile route

db.users.update( {phonenumber: phonenumber }, {$set: {"tickets":  [newTicket]  } }, false, function(err, doc) {
                if(err){
                        res.send(err);
                    } else {
                        console.log('ticket Added...');
                        res.redirect('/profile'); // Change render to redirect

                    }
            });

Upvotes: 0

Related Questions