表示authentication中间件在PUT请求后无法正确redirect

我正在使用下面的中间件passportjs。 假设用户在请求某些事情时是否login。 如果他没有login,他应该被redirect到login页面。

我有一个请求路由如下:

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

当用户尝试更新网站中名为“幻想团队”的资源时,将会调用此路线

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

 exports.requiresLogin = function (req, res, next) { if (req.isAuthenticated()) { return next() } return res.redirect("/signin"); }; 

login我的用户后,我通过删除会话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中间件来检查用户是否login。因此,事实certificate,用户没有login,因为我删除他的会话cookie。 按预期调用res.redirect。 但是,该网站不会redirect到login页面。 我在node.js命令日志中看到了这一点:

 PUT /signin 404 328ms 

我做错了什么?

看起来问题是你没有PUT / signin的路由处理器。 最初的请求是一个put,所以当它redirect的时候,它仍然是来自浏览器的“put”请求的一部分。 只需添加一个处理程序put / post /不pipe用app.all('/ signin')