PassportJs的passport.session()与文件上传器冲突 - 不会写文件

时间:2012-11-13 15:03:12

标签: node.js express passport.js valums-file-uploader

好吧,在这一个人的头上撞到我的头。我只是从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行很有趣,它显示了绑定的事件,然后在第二个文本块中,事件只是{}(空)。

2 个答案:

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