Saya menggunakan node dengan express + mongoose dan mencoba menggunakan passport.js dengan restful api.
Saya terus mendapatkan pengecualian ini setelah otentikasi berhasil (saya melihat url panggilan balik di 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
Saya telah membaca bahwa saya harus meletakkan app.use(passport.initialize());
dan app.use(passport.session());
sebelumnya app.use(app.router);
dan inilah yang saya lakukan. Ini express.js saya yang mendaftarkan 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'
});
});
});
};
Apa yang salah?
PEMBARUAN Menurut @Peter Lyons saya telah mengubah urutan konfigurasi menjadi berikut, tetapi saya masih mendapat kesalahan yang sama:
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'
});
});
});
};
Jawaban:
Ikuti contoh untuk menghindari neraka middleware rusak yang membuatnya begitu mudah untuk dimasuki. Langsung dari dokumen. Perhatikan bagaimana milik Anda tidak sama persis dengan ini.
Docs
Kamu
sumber
app.get
,app.post
, dll? Itu akan menyebabkan router ditambahkan ke tumpukan lebih awal dari yang Anda inginkan. Tunjukkan kepada kami SEMUA kode yang dimulai dengan saat Anda menjalankanexpress()
fungsi untuk mendapatkanapp
objek Anda . Itu tebakan saya yang kedua.Dalam kasus saya (pesan kesalahan yang sama), saya sama sekali lupa menambahkan inisialisasi paspor:
PEMBARUAN: Hanya bekerja hingga versi ekspres 3, versi 4 tidak lagi mendukung app.configure ()
sumber
Dalam kasus saya kesalahan itu karena saya mencoba untuk promisify
req.login
tanpa mengikatthis
untukreq
, jadi ketika fungsi dipanggil itu tidak bisa menemukanpassport
pengaturan. Solusinya mengikatreq.login.bind(req)
sebelum meneruskannyapromisify
jika Anda menggunakan Node v8.sumber
function({ login })
meneruskanreq
sebagai argumen pertama. Solusi Anda berhasil untuk saya, terima kasihthis
kerja di Javascript. Jika Anda tidak memanggil fungsi sebagai metode objek makathis
akanundefined
(atauwindow
di browser)Function.prototype.call
,,Function.prototype.apply
bagaimana carathis
kerja Javascript dan prinsip di balik pewarisan prototipe, Anda akan mempromosikannya ke tingkat Javascript Guru dalam proses :)util.promisify(req.login.bind(req));
Apa yang telah membantu saya juga adalah menempatkan rute SETELAH konfigurasi cookie :
sumber
Jawaban Peter Lyons membantu saya untuk menyelesaikannya, tetapi saya menyelesaikannya dengan cara yang sedikit berbeda.
Lihat repo GitHub saya untuk seluruh kode dan bukan hanya cuplikan kode di sini.
sumber
Dalam kasus saya (pesan kesalahan yang sama), saya sedang mengembangkan strategi kustom dan saya tidak perlu menggunakan sesi . Saya baru saja lupa menambahkan middleware
session: false
rute sayaauthenticate
.sumber