passport.js passport.initialize()中间件未被使用

我正在使用express + mongoose的节点,并尝试使用passport.js和restful api。
validation成功后,我一直收到这个exception(我在浏览器上看到了callbackurl):

/Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/utils.js:419 throw err; ^ Error: passport.initialize() middleware not in use at IncomingMessage.req.login.req.logIn (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/http/request.js:30:30) at Context.module.exports.delegate.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/middleware/authenticate.js:194:13) at Context.actions.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/context/http/actions.js:21:25) at verified (/Users/naorye/dev/naorye/myproj/node_modules/passport-facebook/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:133:18) at Promise.module.exports.passport.use.GitHubStrategy.clientID (/Users/naorye/dev/naorye/myproj/config/passport.js:91:24) at Promise.onResolve (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) at Promise.EventEmitter.emit (events.js:96:17) at Promise.emit (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) at Promise.fulfill (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) at /Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/query.js:1822:13 

我读过,我应该把app.use(passport.initialize());app.use(passport.session());app.use(app.router);之前app.use(app.router); 这就是我所做的。 这是我的express.js注册中间件:

 var express = require('express'), mongoStore = require('connect-mongo')(express), flash = require('connect-flash'), helpers = require('view-helpers'); module.exports = function (app, config, passport) { app.set('showStackError', true); // should be placed before express.static app.use(express.compress({ filter: function (req, res) { return /json|text|javascript|css/.test(res.getHeader('Content-Type')); }, level: 9 })); app.use(express.favicon()); app.use(express.static(config.root + '/public')); app.use(express.logger('dev')); // set views path, template engine and default layout app.set('views', config.root + '/app/views'); app.set('view engine', 'jade'); app.configure(function () { // use passport session app.use(passport.initialize()); app.use(passport.session()); // dynamic helpers app.use(helpers(config.app.name)); // cookieParser should be above session app.use(express.cookieParser()); // bodyParser should be above methodOverride app.use(express.bodyParser()); app.use(express.methodOverride()); // express/mongo session storage app.use(express.session({ secret: 'linkit', store: new mongoStore({ url: config.db, collection : 'sessions' }) })); // connect flash for flash messages app.use(flash()); // routes should be at the last app.use(app.router); // assume "not found" in the error msgs // is a 404. this is somewhat silly, but // valid, you can do whatever you like, set // properties, use instanceof etc. app.use(function(err, req, res, next){ // treat as 404 if (~err.message.indexOf('not found')) { return next(); } // log it console.error(err.stack); // error page res.status(500).render('500', { error: err.stack }); }); // assume 404 since no middleware responded app.use(function(req, res, next){ res.status(404).render('404', { url: req.originalUrl, error: 'Not found' }); }); }); }; 

哪里不对?

更新根据@Peter里昂我已经改变了configuration顺序为以下,但我仍然有同样的错误:

 var express = require('express'), mongoStore = require('connect-mongo')(express), flash = require('connect-flash'), helpers = require('view-helpers'); module.exports = function (app, config, passport) { app.set('showStackError', true); // should be placed before express.static app.use(express.compress({ filter: function (req, res) { return /json|text|javascript|css/.test(res.getHeader('Content-Type')); }, level: 9 })); app.use(express.favicon()); app.use(express.static(config.root + '/public')); app.use(express.logger('dev')); // set views path, template engine and default layout app.set('views', config.root + '/app/views'); app.set('view engine', 'jade'); app.configure(function () { // dynamic helpers app.use(helpers(config.app.name)); // cookieParser should be above session app.use(express.cookieParser()); // bodyParser should be above methodOverride app.use(express.bodyParser()); app.use(express.methodOverride()); // express/mongo session storage app.use(express.session({ secret: 'linkit', store: new mongoStore({ url: config.db, collection : 'sessions' }) })); // connect flash for flash messages app.use(flash()); // use passport session app.use(passport.initialize()); app.use(passport.session()); // routes should be at the last app.use(app.router); // assume "not found" in the error msgs // is a 404. this is somewhat silly, but // valid, you can do whatever you like, set // properties, use instanceof etc. app.use(function(err, req, res, next){ // treat as 404 if (~err.message.indexOf('not found')) { return next(); } // log it console.error(err.stack); // error page res.status(500).render('500', { error: err.stack }); }); // assume 404 since no middleware responded app.use(function(req, res, next){ res.status(404).render('404', { url: req.originalUrl, error: 'Not found' }); }); }); }; 

按照这个例子,避免expression无序的中间件地狱,让它很容易进入。 直接从文档。 请注意,你的不完全符合这一点。

 var app = express(); app.use(require('serve-static')(__dirname + '/../../public')); app.use(require('cookie-parser')()); app.use(require('body-parser').urlencoded({ extended: true })); app.use(require('express-session')({ secret: 'keyboard cat', resave: true, saveUninitialized: true })); app.use(passport.initialize()); app.use(passport.session()); 

文件

  1. cookieParser
  2. 会议
  3. passport.initialize
  4. passport.session
  5. app.router

  1. passport.initialize
  2. passport.session
  3. cookieParser
  4. 会议
  5. app.router

在我的情况下(同样的错误信息)我忘了添加护照初始化:

 app.configure(function () { ... app.use(passport.initialize()); app.use(passport.session()); }); 

更新:只有工作expression版本3,版本4不支持app.configure()了

彼得里昂的答案帮助我解决了这个问题,但我用不同的方式解决了这个问题。

 app.use( cookieSession({ maxAge: 30 * 24 * 60 * 60 * 1000, keys: [keys.cookieKey], }), ); app.use(passport.initialize()); app.use(passport.session()); 

看看我的GitHub回购整个代码,而不仅仅是这里的代码片段。