2017-02-17 1 views
1

Ich versuche, Benutzer-Login-Modul zu einer bestehenden App in Knoten hinzuzufügen. Es verwendet separate Routendateien für jedes Modul und eine Hauptroute-Datei, um alle untergeordneten Routen zu verwenden, die letztlich in server.js verwendet wird. Wenn ich versuche, die Passinstanz an die Benutzerroute weiterzuleiten, gibt es einen Fehler, da der Pass nicht definiert ist . Hier ist meine App-Code und Struktur:Route Trennung in Express-Routing mit Pass-Instanz übergeben

app 
    views 
     user 
      index.ejs 
      login.ejs 
      signup.ejs 
      profile.ejs 
    routes 
     docs 
      index.js 
     user 
      index.js 
     index.js 
    config 
     passport.js 

    server.js 

server.js

const express = require('express') 
    const app = express() 
    const path = require('path') 
    const bodyParser = require('body-parser') 
    const cookieParser = require('cookie-parser') 
    const passport = require('passport') 
    const flash = require('connect-flash') 
    const session = require('express-session') 

    const routes = require('./routes/') 

    const port = process.env.PORT || 3000; 

    app.use(express.static(path.join(__dirname, 'public'))); 

    require('./config/passport')(passport); 

    app.use(bodyParser.urlencoded({ 
     extended: true 
    })); 

    app.use(cookieParser()); 
    app.use(bodyParser.json()); 

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


    app.use(session({ secret: '********' })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    app.use(flash()); 

    app.use('/', routes)(app,passport); 

    const server = app.listen(port, function(){ 
     console.log('Server listening on port '+port); 
    }); 

config/passport.js

var LocalStrategy = require('passport-local').Strategy; 
const sql = require('mssql') 
const bcrypt = require('bcrypt-nodejs') 

module.exports = function(passport) { 


    passport.serializeUser(function(user, done) { 
     done(null, user); 
    }); 

    passport.deserializeUser(function (username, done) { 
     done(null,username); 
    }); 


    passport.use('local-signup', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     process.nextTick(function() { 


     var strSQL = "SELECT count(id) as uCount FROM <tbl> WHERE username = '"+email+"'"; 
     var cb1 = function(err,recordset){ 
      if(recordset[0].uCount>0){ 
       return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
      } else{ 
       var strSQL1 = "INSERT INTO <tbl>(username, password) VALUES('"+email+"','"+generateHash(password)+"')"; 
       var cb2 = function(err,recordset){ 
        return done(null, recordset,req.flash('signupMessage', 'Email registered successfully.')); 
       }; 
       executeQuery(strSQL1,'INSERTION','<tbl>',cb2); 
      } 
     }; 
     executeSelection(strSQL,'SELECTION','<tbl>',cb1); 
     }); 

    })); 

    passport.use('local-login', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 

     var strSQL = "SELECT a.count, id, username, password FROM <tbl> c , (SELECT COUNT(dbid) count FROM <tbl> b WHERE b.username = '"+email+"') a WHERE c.username = '"+email+"'"; 
     var cb1 = function(err,recordset){ 
      if(recordset[0].uCount <= 0){ 
       return done(null, false, req.flash('loginMessage', 'No user found.')); 
      } 

      if (!validPassword(password,recordset[0].password)) 
       return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 

      return done(null, recordset[0]); 
     }; 
     executeSelection(strSQL,'SELECTION','<tbl>',cb1); 

    })); 

}; 

executeSelection = function(strSQL, operationType, tableName, cb){ 
    var request = new sql.Request(connection); 

    request.query(strSQL,function(err,recordset) { 
     if(err){ 
      logger.error('ERROR in '+operationType+' ON '+tableName+': '+err); 
     } 
     logger.info(operationType+' ON '+tableName+' successful!'); 
     cb(err,recordset); 
    }); 

}; 

executeQuery = function(strSQL, operationType, tableName, cb,validateClient) { 
    var request = new sql.Request(connection); 
    request.query(strSQL,function(err, recordset) { 
     if(err){ 
      logger.error('ERROR in '+operationType+' ON '+tableName+': '+err); 
     } 
     logger.info(operationType+' ON '+tableName+' successful!'); 
     if(cb){ 
      cb(validateClient); 
     } 
    }); 
}; 

generatePasswordHash = function(password) { 
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
}; 

validatePassword = function(curPass, dbPass) { 
    return bcrypt.compareSync(curPass, dbPass); 
}; 

Routen/index.js

const mainroute = require('express').Router() 

    /* ---- other existing routes included ---- */ 
    const r_docs = require('./docs') 
    const r_user = require('./user') /*my custom route*/ 

    /* ---- all other routes ---- */ 
    mainroute.use('/docs', r_docs); 
    mainroute.use('/user', r_user)(app, passport);  /*my custom route*/ 

    mainroute.get('/', function(req, res){ 
     res.render('home'); 
    }); 

    module.exports = function(app, passport){ 
     mainroute; 
    } 

Routen /user/index.js

const express = require('express') 
    const router = express.Router() 

    router.get('/', function(req, res) { 
     res.render('user/index.ejs'); 
    }); 

    router.get('/login', function(req, res) { 
     res.render('user/login.ejs', { message: req.flash('loginMessage') }); 
    }); 

    // process the login form 
    router.post('/login', passport.authenticate('local-login', { 
     successRedirect : '/profile', 
     failureRedirect : '/login', 
     failureFlash : true 
    })); 

    router.get('/signup', function(req, res) { 
     res.render('user/signup.ejs', { message: req.flash('signupMessage') }); 
    }); 

    router.post('/signup', passport.authenticate('local-signup', { 
     successRedirect : '/profile', 
     failureRedirect : '/signup', 
     failureFlash : true 
    })); 

    router.get('/profile', isLoggedIn, function(req, res) { 
     res.render('user/profile.ejs', { 
      user : req.user 
     }); 
    }); 

    router.get('/logout', function(req, res) { 
     req.logout(); 
     res.redirect('/'); 
    }); 

    function isLoggedIn(req, res, next) { 

     if (req.isAuthenticated()) 
      return next(); 

     res.redirect('/'); 
    } 

    module.exports = function(app, passport) { 
     router; 
    } 

Bitte schlagen Sie vor, was mache ich hier falsch. Danke

Antwort

0

Sie müssen es oben auf Ihrem Benutzer/index.js benötigen. Einfach gesagt:

var passport = require('passport'); 

Dann wird der Benutzer sicherstellen, dass authentifiziert wird:

router.get('/some/path', isLoggedIn, function(req, res) { 
    var user   = req.user; 
}); 

function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()) 
     return next(); 

    res.redirect('/'); 
} 
2

Sie sollten Ihre main und user Routen wickeln ihre Logik laufen, wenn Sie sie und am Ende Rückkehr vorbereitet Route nennen:

Routen/index.js

module.exports = function(app, passport) { 
    const mainroute = require('express').Router() 

    /* ---- other existing routes included ---- */ 
    const r_docs = require('./docs'); 
    const r_user = require('./user'); /*my custom route*/ 

    /* ---- all other routes ---- */ 
    mainroute.use('/docs', r_docs); 
    mainroute.use('/user', r_user)(app, passport); /*my custom route*/ 

    mainroute.get('/', function(req, res) { 
    res.render('home'); 
    }); 

    return mainroute; 
}; 

Routen/user/index.js

module.exports = function(app, passport) { 
    const express = require('express'); 
    const router = express.Router(); 

    router.get('/', function(req, res) { 
    res.render('user/index.ejs'); 
    }); 

    router.get('/login', function(req, res) { 
    res.render('user/login.ejs', { 
     message: req.flash('loginMessage') 
    }); 
    }); 

    // process the login form 
    router.post('/login', passport.authenticate('local-login', { 
    successRedirect: '/profile', 
    failureRedirect: '/login', 
    failureFlash: true 
    })); 

    router.get('/signup', function(req, res) { 
    res.render('user/signup.ejs', { 
     message: req.flash('signupMessage') 
    }); 
    }); 

    router.post('/signup', passport.authenticate('local-signup', { 
    successRedirect: '/profile', 
    failureRedirect: '/signup', 
    failureFlash: true 
    })); 

    router.get('/profile', isLoggedIn, function(req, res) { 
    res.render('user/profile.ejs', { 
     user: req.user 
    }); 
    }); 

    router.get('/logout', function(req, res) { 
    req.logout(); 
    res.redirect('/'); 
    }); 

    function isLoggedIn(req, res, next) { 

    if (req.isAuthenticated()) 
     return next(); 

    res.redirect('/'); 
    } 

    return router; 
}; 
+0

Gibt es einen Grund, warum module.exports = function (app, Reisepass) {return Router;} wird nicht funktionieren, sondern ganzen Block in module.exports umschließen würde ?? Noch neu zu Knoten, also nach etwas Erklärung suchen. –

+0

Da Ihr Router die Parameter * app * und * pass * für das Routing benötigt. wenn du nur 'module.exports = funktion (app, pass) {return router; } '* App * und * Reisepass * sind außerhalb des Geltungsbereichs und so" undefined " – dNitro

+0

und wir können sie nicht so übergeben, dass beide Vars im Umfang für den Exportblock sind? Nur für den Fall, dass Sie eine konsistente Exportmethode in der gesamten Anwendung folgen müssen. –