J'utilise node avec express + mongoose et j'essaie d'utiliser passeport.js avec une api reposante.
Je continue à recevoir cette exception après le succès de l'authentification (je vois l'URL de rappel sur le navigateur):
/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
J'ai lu que je devrais mettre app.use(passport.initialize());
et app.use(passport.session());
avant app.use(app.router);
et c'est ce que j'ai fait. Voici mon express.js qui enregistre les middlewares:
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'
});
});
});
};
Qu'est-ce qui ne va pas?
MISE À JOUR Selon @Peter Lyons, j'ai changé l'ordre des configurations comme suit, mais j'ai toujours la même erreur:
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'
});
});
});
};
Réponses:
Suivez l'exemple pour éviter l'enfer du middleware hors service qu'express facilite l'accès. Directement de la documentation. Notez que le vôtre ne correspond pas exactement à cela.
Docs
Tu
la source
app.get
,app.post
etc? Ceux-ci entraîneront l'ajout du routeur à la pile plus tôt que prévu. Montrez-nous TOUS le code révélateur en commençant par lorsque vous appelez laexpress()
fonction pour obtenir votreapp
objet. C'est ma deuxième hypothèse.Dans mon cas (même message d'erreur), j'ai oublié du tout d'ajouter les initialisations du passeport:
MISE À JOUR: Ne fonctionne que jusqu'à la version express 3, la version 4 ne prend plus en charge app.configure ()
la source
Dans mon cas , l'erreur a été parce que je tente de promisify
req.login
sans se lierthis
àreq
, alors quand la fonction a été appelée il ne pouvait pas trouver lespassport
paramètres. La solution est contraignantereq.login.bind(req)
avant de la transmettrepromisify
si vous utilisez Node v8.la source
function({ login })
passer lereq
comme premier argument. Votre solution a fonctionné pour moi, mercithis
fonctionne en Javascript. Si vous n'appelez pas la fonction en tant que méthode objet, lethis
seraundefined
(ouwindow
dans le navigateur)Function.prototype.call
,Function.prototype.apply
commentthis
fonctionne en Javascript et les principes derrière l' héritage prototypique, vous ferez la promotion au niveau de Javascript Guru dans le processus :)util.promisify(req.login.bind(req));
Ce qui m'a aidé aussi, c'est de mettre des routes APRÈS la configuration des cookies :
la source
La réponse de Peter Lyons m'a aidé à le résoudre, mais je l'ai résolu d'une manière un peu différente.
Jetez un œil à mon dépôt GitHub pour tout le code et pas seulement l'extrait de code ici.
la source
Dans mon cas (même message d'erreur), je développais une stratégie personnalisée et je n'ai pas besoin d'utiliser une session . J'ai juste oublié d'ajouter
session: false
dans monauthenticate
middleware de route .la source
Placez le
app.use(passport.initialize())
middleware devant le middlewareapp.router
et cela fonctionne comme un charmela source