PassportJs的passport.session()与file upload冲突 – 不会写入文件

好吧,把我的头靠在墙上。 我只是从everyauth切换到passportjs,一切都很好,除了我的Valumsfile upload器的实现。

你可以在https://gist.github.com/4066155看到我的fileuploader代码的要点

我的app.configureexpression如下所示:

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()); – file upload似乎工作正常。 passport.initialize可以保留,因为它不会造成任何问题。

如果我在代码中保留使用passport.session,上传调用就会通过,它实际上会在我的tmp目录中创build一个临时文件,但它保持为零字节。 服务器从不响应Web客户端(没有callback),文件从来没有真正由fs写入。

即使是一个正确的方向指针可能是非常有帮助的。 如果你需要更多的上下文,让我知道。 谢谢。

更新:

如果有帮助的话,我会分析reqvariables来查看passport.session在调用passport.session时没有被调用的差异。 第一个差异是passport.session没有被调用,第二个是被调用的。 URL: http : //diffchecker.com/Xk8g434Q – 第469行很有意思,它显示了被绑定的事件,然后在第二块文本中,事件只是{}(空)。

passport.session()方法调用你的passport.deserializeUser() ,它本身通常会进行数据库调用来获取用户。 此数据库调用会延迟开始监听传入数据的代码的执行。 也就是说,数据到达,而没有人正在听它。

如果有人遇到这种情况,一种解决方法虽然不是很理想,但只是在PassportJS会话中间件周围增加一层额外的中间件 – 显然不会对file upload进行身份validation,但到目前为止,没有人回答我的问题,一直无法find它为什么会发生冲突。

这里有一些代码可以放在Express的app.configure(function()(就在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) })