2

好吧,把我的头撞在墙上。我刚刚从everyauth 切换到passportjs,一切都很好,除了我实现的Valums 文件上传器。

您可以在https://gist.github.com/4066155看到我的文件上传器代码的要点

我的快递 app.configure 如下所示:

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 可以保留,因为它不会引起任何问题。

如果我在代码中保留 use passport.session,则上传调用会通过,它实际上确实在我的 tmp 目录中创建了一个临时文件,但它保持为零字节。服务器从不响应 Web 客户端(无回调),并且文件实际上从未由 fs 写入。

即使是指向正确方向的指针也可能非常有帮助。如果您需要更多上下文,请告诉我。谢谢。

更新:

如果有帮助,我对 req 变量进行了比较,以查看未调用 passport.session 与调用 passport.session 时的区别。第一个差异是未调用的 passport.session,第二个是被调用的。URL:http ://diffchecker.com/Xk8g434Q - 第 469 行很有趣,它显示了正在绑定的事件,然后在第二个文本块中,事件只是 {}(空)。

4

2 回答 2

1

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

于 2013-04-26T11:52:32.380 回答
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)
  })
于 2012-11-17T15:14:50.160 回答