Passport.session() PassportJs конфликтует с загрузчиком файла - не будет записывать файл
Хорошо, ударился головой об стену на этом. Я просто переключился с Everyauth на Passportjs, и все работало отлично, кроме моей реализации загрузчика файлов Valums.
Вы можете увидеть суть моего кода загрузчика файлов на https://gist.github.com/4066155
Мой app.configure for express выглядит так:
app.configure( function () {
app.use(express.methodOverride());
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.set('view options', {
layout: false
});
app.use(passport.initialize());
app.use(passport.session());
});
Как ни странно, если я закомментирую app.use (passport.session ()); - загрузчик файлов, кажется, работает нормально. Passport.initialize может остаться, так как он не вызывает никаких проблем.
Если я сохраню использование passport.session в своем коде, произойдет вызов загрузки, он фактически создаст временный файл в моем каталоге tmp, но останется равным нулю байтов. Сервер никогда не отвечает на веб-клиент (без обратного вызова), и файл никогда не записывается с помощью fs.
Даже указатель в правильном направлении может быть очень полезным. Если вам нужно больше контекста, дайте мне знать. Благодарю.
Обновить:
Если это поможет, я использовал переменную req, чтобы увидеть разницу, когда passport.session не вызывается, и когда вызывается passport.session. Первый diff с passport.session НЕ вызывается, а второй, когда он вызывается. URL: http://diffchecker.com/Xk8g434Q - строка 469 интересна тем, что показывает связанные события, а затем во втором блоке текста события просто {} (пусто).
2 ответа
passport.session()
метод вызывает ваш passport.deserializeUser()
, который обычно выполняет вызов базы данных для извлечения пользователя. Этот вызов базы данных задерживает выполнение кода, который начинает прослушивание входящих данных. То есть данные поступают, пока их никто не слушает.
Если кто-то сталкивается с этим, один из обходных путей, хотя и не идеальный, - это просто добавить дополнительный слой промежуточного программного обеспечения вокруг промежуточного программного обеспечения сеанса PassportJS - очевидно, он не собирается проверять подлинность файловых загрузок, но пока никто не ответил на мой вопрос, и я до сих пор не смог найти, почему это конфликтует.
Вот некоторый код, который вы можете поместить в app.configure( function () {Express) сразу после app.use(passport.initialize()).
var sessionMiddleware = passport.session()
app.use(function(req, res, next) {
if (req.url.match("/upload")) return next()
console.log("Using session", req.url)
sessionMiddleware(req, res, next)
})