1

我在下面使用带有中间件的passportjs。假设在用户请求某些内容时检查用户是否登录。如果他没有登录,他应该被重定向到登录页面。

我有一个请求路线如下:

app.put('/fantasyteams/:fantasyTeamId', auth.requiresLogin, fantasyteams.update);

当用户尝试更新网站中名为 Fantasy Team 的资源时,将调用此路由

auth.requiresLogin 是一个中间件,如下:

exports.requiresLogin = function (req, res, next) {
  if (req.isAuthenticated()) {
    return next()

  }
  return res.redirect("/signin");
};

登录我的用户后,我通过删除会话 cookie 来模拟会话到期。此后通过网站我提出了一个 PUT '/fantasyteams/123' 请求来更新幻想队编号 123。

Fantasyteams.update 只是一个 mongodb / mongoose 保存操作:

exports.update = function(req, res){
    var fantasyteam = req.fantasyteam;
    fantasyteam = _.extend(fantasyteam, req.body);
    fantasyteam.save(function(err){
        res.jsonp(fantasyteam);
    });
};

正如预期的那样,上面的路由处理程序(app.put ...)捕获了请求,将其传递给 auth.requiresLogin 中间件以检查用户是否已登录。所以事实证明,自从我删除后,用户没有登录他的会话cookie。res.redirect 按预期调用。但是,该网站不会重定向到登录页面。我在 node.js 命令日志中看到了这一点:

PUT /signin 404 328ms

我做错了什么?

4

1 回答 1

1

看起来问题是您没有 PUT /signin 的路由处理程序。原始请求是一个 put,因此当它重定向时,它仍然是来自浏览器的同一个“put”请求的一部分。只需使用 app.all('/signin') 为 put/post/whatever 添加一个处理程序

于 2013-09-08T10:18:46.677 回答