Ich verwende Node mit Express + Mungo und versuche, passport.js mit erholsamer API zu verwenden.
Ich erhalte diese Ausnahme nach erfolgreicher Authentifizierung immer wieder (ich sehe die Rückruf-URL im Browser):
/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
Ich habe gelesen, dass ich app.use(passport.initialize());
und app.use(passport.session());
vorher setzen sollte und app.use(app.router);
das habe ich getan. Hier ist meine express.js, die die Middleware registriert:
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'
});
});
});
};
Was ist falsch?
UPDATE Laut @Peter Lyons habe ich die Konfigurationsreihenfolge wie folgt geändert, aber ich habe immer noch den gleichen Fehler erhalten:
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'
});
});
});
};
Antworten:
Befolgen Sie das Beispiel, um die Middleware-Hölle zu vermeiden, die durch Express so einfach zu betreten ist. Direkt aus den Dokumenten. Beachten Sie, dass Ihre nicht genau dazu passt.
Docs
Du
quelle
app.get
,app.post
etc? Dadurch wird der Router früher als beabsichtigt zum Stapel hinzugefügt. Zeigen Sie uns den gesamten offenbarenden Code, beginnend mit dem Aufrufen derexpress()
Funktion zum Abrufen Ihresapp
Objekts. Das ist meine 2. Vermutung.In meinem Fall (gleiche Fehlermeldung) habe ich vergessen, die Passinitialisierungen überhaupt hinzuzufügen:
UPDATE: Nur bis Express Version 3, Version 4 unterstützt app.configure () nicht mehr
quelle
In meinem Fall lag der Fehler darin, dass ich versucht habe,
req.login
ohne Bindungthis
an zu versprechenreq
, sodass beim Aufrufen der Funktion keinepassport
Einstellungen gefunden werden konnten. Die Lösung ist verbindlich,req.login.bind(req)
bevor sie anpromisify
Node v8 übergeben wird.quelle
function({ login })
Übergeben desreq
ersten Arguments. Ihre Lösung hat für mich funktioniert, dankethis
funktioniert es in Javascript. Wenn Sie die Funktion nicht als Objektmethode aufrufen,this
wirdundefined
(oderwindow
im Browser)Function.prototype.call
,Function.prototype.apply
wiethis
Javascript funktioniert und welche Prinzipien hinter der prototypischen Vererbung stehen, werden Sie dabei auf die Ebene des Javascript Guru aufsteigen :)util.promisify(req.login.bind(req));
Was mir auch geholfen hat war, Routen NACH Cookies zu setzen config:
quelle
Die Antwort von Peter Lyons hat mir geholfen, es zu lösen, aber ich habe es auf eine etwas andere Art und Weise gelöst.
Schauen Sie sich mein GitHub-Repo für den gesamten Code und nicht nur das Code-Snippet hier an.
quelle
In meinem Fall (gleiche Fehlermeldung) habe ich eine benutzerdefinierte Strategie entwickelt und muss keine Sitzung verwenden . Ich habe nur vergessen,
session: false
meine Routeauthenticate
Middleware hinzuzufügen .quelle