user7392939
user7392939

Reputation: 21

Node.js "cannot set property firstName of undefined"

I am following this tutorial,

https://www.youtube.com/watch?v=OnuC3VtEQks

to create a login system for my node app, only thing is since he is using mongoDb and I'm using mySql, I had to think of a way around him setting up his mongoose schema (right around 7:14 of the video), so I just exported a user module and assigned properties to it in my create a user logic.

Here's the user module

//user.js in models
var bcrypt = require('bcryptjs');

var User = {
    firstName: "firstName",
    lastName: "lastName",
    email: "email",
    username: "username",
    password: "password",
}

module.exports = User;

module.exports.createUser = function(newUser, callback){
    bcrypt.genSalt(10, function(err, salt) {
        bcrypt.hash(newUser.password, salt, function(err, hash) {
            newUser.password = hash;
            newUser.save(callback);
        });
    });
}

Here is my route for the registration form

// main.js in router folder
var user = require('../models/user').User;

router.post('/register', function(req, res){
    var firstName = req.body.firstName;
    var lastName = req.body.lastName;
    var email = req.body.email;
    var username = req.body.username;
    var password = req.body.password;
    var cpassword = req.body.cpassword;

    //Validation
    // req.checkBody('firstName', 'First name is required!').notEmpty();
    // req.checkBody('lastName', 'Last name is required!').notEmpty();
    // req.checkBody('email', 'E-mail is invalid!').isEmail();
    // req.checkBody('username', 'Username is required!').notEmpty();
    // req.checkBody('password', 'Password is required!').notEmpty();
    // req.checkBody('cpassword', 'Passwords do not match!').equals(password);

    var errors = req.validationErrors();
    if(errors){
        res.render('register', {
            errors: errors
        });
        console.log(errors);
    } else {
        var newUser = user;

        newUser.firstName = firstName;
        newUser.lastName = lastName;
        newUser.email = email;
        newUser.username = username;
        newUser.password = password;

        User.createUser(newUser, function(err, user){
            if(err) throw err;
            console.log(user);
        });

        req.flash('success_msg', 'You are now registered!');
        res.redirect('login');
    }
});

Now I keep getting "cannot set property firstName of undefined error", but I thought I had access to my User object from the user.js module? From what I can tell it looks like he's just using the form input to instantiate the user object and create it with some password hashing.

If this is a bad approach, I am completely open to any ideas to make this simpler. I am completely new to node and my senior project is due in 2 weeks, so any help will be immensely appreciated and rewarded with upvotes and internet credits :)

Upvotes: 0

Views: 1314

Answers (2)

Nimrod P.
Nimrod P.

Reputation: 160

You should change your user.js as follows:

//user.js in models
var bcrypt = require('bcryptjs');

var User = {
    firstName: "firstName",
    lastName: "lastName",
    email: "email",
    username: "username",
    password: "password",
}

module.exports = {
    User: User,
    createUser: function (newUser, callback) {
        bcrypt.genSalt(10, function (err, salt) {
            bcrypt.hash(newUser.password, salt, function (err, hash) {
                newUser.password = hash;
                newUser.save(callback);
            });
        });
    }
}

This would solve all of your problems.

Upvotes: 1

Matt
Matt

Reputation: 987

You declare (and export) the object User (with a capital U) earlier in the program, but later on try and access the variable user, which is undefined

var newUser = user;

Upvotes: 0

Related Questions