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) })