好吧,在这一个人的头上撞到我的头。我只是从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目录中创建一个临时文件,但它保持零字节。服务器永远不会响应Web客户端(没有回调),文件永远不会被fs写入。
即使是正确方向的指针也可能非常有用。如果您需要更多上下文,请告诉我。感谢。
更新
如果有帮助,我会在调用passport.session时调用req变量以查看当没有调用passport.session时的差异。第一个差异是没有调用passport.session,而是调用它时的第二个差异。 URL:http://diffchecker.com/Xk8g434Q - 第469行很有趣,它显示了绑定的事件,然后在第二个文本块中,事件只是{}(空)。
答案 0 :(得分:1)
passport.session()
方法调用您的passport.deserializeUser()
,它本身通常会进行数据库调用以获取用户。此数据库调用会延迟执行开始侦听传入数据的代码。也就是说,数据到达时没有人在听它。
答案 1 :(得分:0)
如果有人遇到这种情况,一种解决方法虽然不理想,但只是在PassportJS会话中间件周围添加一层额外的中间件 - 显然不会对文件上传进行身份验证,但到目前为止还没有人回答我的问题,我仍然无法找到它冲突的原因。
这里有一些代码可以放在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)
})