Tuesday, May 9, 2017

object Object error in signup with passport in express

Leave a Comment

I have a user model with id, password, and email. When I try to signup it shows [object Object] error in form and it doesn't post user data in the database. In the console, it shows POST /signup 302 -58. Here's whole passport.js file:

var LocalStrategy    = require('passport-local').Strategy;  // load up the user model var configDB = require('./database.js'); var Sequelize = require('sequelize'); var sequelize = new Sequelize(configDB.url);  var User       = sequelize.import('../app/models/users'); User.sync();  // load the auth variables var configAuth = require('./auth'); // use this one for testing  module.exports = function(passport) {  =========================================================================         // passport session setup ==================================================         // required for persistent login sessions         // passport needs ability to serialize and unserialize users out of session      // used to serialize the user for the session     passport.serializeUser(function(user, done) {         done(null, user.id);     });      // used to deserialize the user     passport.deserializeUser(function(id, done) {         User.findById(id).then(function(user){             done(null, user);         }).catch(function(e){             done(e, false);         });     });      // =========================================================================     // LOCAL LOGIN =============================================================      passport.use('local-login', new LocalStrategy({         // by default, local strategy uses username and password, we will override with email         usernameField : 'email',         passwordField : 'password',         passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)     },     function(req, email, password, done) {                   User.findOne({ where: { email: email }})                 .then(function(user) {                     if (!user) {                         done(null, false, req.flash('loginMessage', 'Unknown user'));                     } else if (!user.validPassword(password)) {                         done(null, false, req.flash('loginMessage', 'Wrong password'));                     } else {                         done(null, user);                     }                 })                 .catch(function(e) {                      done(null, false, req.flash('loginMessage',e.name + " " + e.message));                 });                  }));        // =========================================================================     // LOCAL SIGNUP ============================================================     // =========================================================================     passport.use('local-signup', new LocalStrategy({         // by default, local strategy uses username and password, we will override with email         usernameField : 'email',         passwordField : 'password',         passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)     },     function(req, email, password, done) {                 //  Whether we're signing up or connecting an account, we'll need         //  to know if the email address is in use.          User.findOne({ where: { email: email }})             .then(function(existingUser) {                  // check to see if there's already a user with that email                 if (existingUser)                      return done(null, false, req.flash('error', 'That email is already taken.'));                  //  If we're logged in, we're connecting a new local account.                 if(req.user) {                     var user            = req.user;                     user.email    = email;                     user.password = User.generateHash(password);                     user.save().catch(function (err) {                         throw err;                     }).then (function() {                         done(null, user);                     });                 }                  //  We're not logged in, so we're creating a brand new user.                 else {                     // create the user                     var newUser = User.build ({email: email, password: User.generateHash(password)});                      newUser.save().then(function() {done (null, newUser);}).catch(function(err) { done(null, false, req.flash('error', err));});                 }             })             .catch(function (e) {                 done(null, false, req.flash('loginMessage',e.name + " " + e.message));                           })      })); 

And in routes.js

// locally --------------------------------     // LOGIN ===============================     // show the login form     app.get('/login', function(req, res) {         res.render('login.ejs', { message: req.flash('loginMessage') });     });      // process the login form     app.post('/login', passport.authenticate('local-login', {         successRedirect : '/profile', // redirect to the secure profile section         failureRedirect : '/login', // redirect back to the signup page if there is an error         failureFlash : true // allow flash messages     }));      // SIGNUP =================================     // show the signup form     app.get('/signup', function(req, res) {         res.render('signup.ejs', { message: req.flash('loginMessage') });     });      // process the signup form     app.post('/signup', passport.authenticate('local-signup', {         successRedirect : '/profile', // redirect to the secure profile section         failureRedirect : '/signup', // redirect back to the signup page if there is an error         failureFlash : true // allow flash messages     })); 

1 Answers

Answers 1

I found the solution!!! It was simpler than I thought, just a carelessness. In user model I defined password field:

password: { type: DataTypes.STRING(25), allowNull: true, defaultValue: '' }, And after encryption, this field length was too small to storage the value. So I changed it for 255.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment