2017-02-17 19 views
1

Я пытаюсь добавить модуль входа пользователя в существующее приложение в узле. Он использует отдельные файлы маршрутов для каждого модуля и один файл основного маршрута, чтобы использовать все дочерние маршруты, которые в конечном счете используются в server.js. Когда я пытаюсь передать экземпляр паспорта на маршрут пользователя, это дает мне ошибку, поскольку паспорт не определен , Вот мое приложение код и структура:Разделение маршрута в экспресс-маршрутизации с проездом паспортного экземпляра

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); 
    }); 

конфигурации/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); 
}; 

маршруты/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; 
    } 

маршруты /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; 
    } 

Пожалуйста, предложите, что я делаю неправильно здесь. Спасибо

ответ

0

Вам нужно его в верхней части вашего пользователя/index.js. Просто:

var passport = require('passport'); 

Затем убедитесь, что проверка подлинности пользователя:

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

Вы должны обернуть main и user маршруты, чтобы запустить свою логику, когда вы называете их и в конце возвратного подготовили маршрут:

маршруты/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; 
}; 

маршруты/пользователь/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

Есть ли причина, почему module.exports = функция (приложение, паспорт) {возвращение маршрутизатор;} не будет работать, но вмещающий весь блок в module.exports бы ?? По-прежнему новичок в узле, поэтому вы ищете некоторые объяснения. –

+0

Поскольку ваш маршрутизатор нуждается в параметрах * app * и * паспорт * для маршрутизации. когда вы просто 'module.exports = function (приложение, паспорт) {return router; } '* Приложение * и * паспорт * выходят за рамки и поэтому' undefined' – dNitro

+0

, и мы не можем передать их таким образом, чтобы оба vars были доступны для блока экспорта? На всякий случай нужно следовать последовательному методу экспорта во всем приложении. –

 Смежные вопросы

  • Нет связанных вопросов^_^