如何正确调用passport.js函数与快速路由器?

我试图调用passport.authenticate函数作为对我的注册视图发布请求的响应。 我一直在这里按照这个教程 ,让我的头围绕passport.js和expression,但已经完成指令的第一页,并做了必要的修改express.js 4.0每一页我尝试访问返回错误500,并显示以下stacktrace :

TypeError: Object #<serverResponse> has no method 'authenticate' at module.exports (/home/myUserName/Desktop/manufacturing/routes/index.js:66:37) at Layer.handle [as handle_request] (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/layer.js:82:5) at trim_prefix (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:302:13) at /home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:270:7 at Function.proto.process_params (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:321:12) at next (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:261:10) at /home/myUserName/Desktop/manufacturing/node_modules/connect-flash/lib/flash.js:21:5 at Layer.handle [as handle_request] (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/layer.js:82:5) at trim_prefix (/home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:302:13) at /home/myUserName/Desktop/manufacturing/node_modules/express/lib/router/index.js:270:7 

这里是/routes/index.js的代码:

 var express = require('express'); var bodyParser = require('body-parser'); var router = express.Router(); module.exports = function(app, passport) { /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Home Page' }); }); /* GET about page */ router.get('/about', function(req, res, next) { res.render('about', { title: 'About Us' }); }); /* GET contact page */ router.get('/contact', function(req, res, next) { res.render('contact', { title: 'Contact Us' }); }); /* GET login page */ router.get('/login', function(req, res, next) { res.render('login', { title: 'User Login', message: req.flash('loginMessage') }); }); /* GET register page */ router.get('/register', function(req, res, next) { res.render('register', { title: 'User Registration', message: req.flash('signupMessage') }); }); /* POST register page */ router.post('/register', passport.authenticate('local', { successRedirect : '/', failureRedirect : '/register', failureFlash : true })); /* Log Out */ router.get('/logout', function(req, res, next) { req.logout(); res.redirect('/'); }); /* 404 - page not found */ router.get('*', function(req, res){ res.render('404', { title: '404 - Not Found' }); }); // Route middleware to make sure a user is logged in function isLoggedIn(req, res, next) { if (req.isAuthenticated()) return next(); res.redirect('/'); }; }; 

这里是我的server.js:

 var express = require('express'); var path = require('path'); var logger = require('morgan'); var mongoose = require('mongoose'); var bodyParser = require('body-parser'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var passport = require('passport'); var flash = require('connect-flash'); // Database var configDB = require('./config/database.js'); mongoose.connect(configDB.url); require('./config/passport')(passport); // Routes var routes = require('./routes/index'); var port = process.env.PORT || 3000; var app = express(); // Express configuration app.use(logger('dev')); // log every request to console app.use(bodyParser.json()); // get information from html forms app.use(bodyParser.urlencoded({ extended: true })); app.use(cookieParser()); // read cookies (needed for auth) app.use(express.static(path.join(__dirname, 'public'))); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); if (app.get('env') === 'development') { app.locals.pretty = true; } // Passport configuration app.use(session({ secret: 'MySecretHere', saveUninitialized: true, resave: true})); // session secret app.use(passport.initialize()); app.use(passport.session()); // persistent login sessions app.use(flash()); // use connect-flash for flash messages stored in session app.use('/', routes); // 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: {} }); }); app.listen(port); console.log('Server running on ' + port); 

你得到错误的原因是因为你导出一个函数,把apppassport作为你的http处理程序的参数,但是当你的server.js需要它的时候,你的不是通过passportapp

你需要以某种方式通过passport进入要求。 你可以改变你的路线文件如果你正在使用express.Router

  var router = express.Router(); module.exports = function(passport) { // init your routes with passport and router router.post('/' function(req, res) { //... }); // make sure to return router in the function though return router; } 

如果不使用express.Router ,则可以传递apppassport ,只需将处理app附加到app程序即可

  module.exports = function (app, passport) { app.post('/', function(req, res) { //... }); // no need to return app } 

然后在server.js中

  // if your using `express.Router()` in routes file app.use('/', require('./routes')(passport)); // If your registering handler on app itself just bootstrap it require('./routes')(app, passport); 

你需要通过护照到你的路线。 你可以这样改变你的代码:

/routes/index.js
from module.exports = function(app, passport) {...}
module.exports = function(passport){ return function(app) {...}}

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