Search code examples
node.jsmongodbexpresspassport.jsswig-template

node.JS Express passport routing


I've created a simple project, with 3 pages: Home, Contact and About.

Everything was working, then I wanted to add users registration with mongo.

So I followed this tutorial

But, when I add somes new routes, I can't acces any more pages.

This was my index.js when I can acces my 3 pages

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});



/* GET contact page. */
router.get('/contact', function(req, res) {
    res.render('contact');
});

/* POST contact page (submit). */
router.post('/contact', function(req, res) {
    res.render('contact', { name: req.param('name') });
});

/* GET home page. */
router.get('/home', function(req, res) {
    res.render('home');
});

/* POST home page (submit). */
router.post('/home', function(req, res) {
    res.render('home', { comm: req.param('comm') });
});


/* GET about page. */
router.get('/about', function(req, res) {
    res.render('about');
});


module.exports = router;

all simple and working. and now, it's like that :

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});



/* GET contact page. */
router.get('/contact', function(req, res) {
    res.render('contact');
});

/* POST contact page (submit). */
router.post('/contact', function(req, res) {
    res.render('contact', { name: req.param('name') });
});

/* GET home page. */
router.get('/home', function(req, res) {
    res.render('home');
});

/* POST home page (submit). */
router.post('/home', function(req, res) {
    res.render('home', { comm: req.param('comm') });
});


/* GET about page. */
router.get('/about', function(req, res) {
    res.render('about');
});


module.exports = router;

module.exports = function(passport){

  // /* GET login page. */
  // router.get('/', function(req, res) {
  //   // Display the Login page with any flash message, if any
  //   res.render('index', { message: req.flash('message') });
  // });

  /* Handle Login POST */
  router.post('/login', passport.authenticate('login', {
    successRedirect: '/home',
    failureRedirect: '/',
    failureFlash : true
  }));

  /* GET Registration Page */
  router.get('/signup', function(req, res){
    res.render('register',{message: req.flash('message')});
  });

  /* Handle Registration POST */
  router.post('/signup', passport.authenticate('signup', {
    successRedirect: '/home',
    failureRedirect: '/signup',
    failureFlash : true
  }));

  return router;
}

and now, no routes are showed.

Any ideas ?

thanks !

EDIT : app.js

var express      = require('express');
var path         = require('path');
var favicon      = require('static-favicon');
var logger       = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser   = require('body-parser');
var swig         = require('swig');

var dbConfig = require('./db.js');
var mongoose = require('mongoose');
mongoose.connect(dbConfig.url);

var routes = require('./routes/index');

var app = express();

// Configuring Passport
var passport = require('passport');
var expressSession = require('express-session');
app.use(expressSession({secret: 'mySecretKey'}));
app.use(passport.initialize());
app.use(passport.session());


// view engine setup
app.engine('html', swig.renderFile);

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

// view cache
app.set('view cache', false);
swig.setDefaults({ cache: false });

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);

/// catch 404 and forwarding 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;

Solution

  • Your module expects a passport object

    module.exports = function(passport){
    

    but you're not calling it with a passport object in app.js

    var routes = require('./routes/index');
    

    also, you'll need to defined passport before calling the routes module. So in the end you'll need to modify your app.js to look something like this:

    var passport = require('passport');
    var expressSession = require('express-session');
    app.use(expressSession({secret: 'mySecretKey'}));
    app.use(passport.initialize());
    app.use(passport.session());
    
    ...
    var routes = require('./routes/index')(passport);
    ...
    app.use('/', routes);