Node.js – 在中间件中使用res.redirect

我想在加载所有的页面之前使用authenticateUser()中间件。 (在app.get('/',authenticateUser,function()…))中,我试图在app.use(authenticateUser)之前调用app.use(app.router )。

但是这并没有奏效。 authenticateUser基本上是:

if (req.session.loginFailed) { next() else { if (req.session.user_id) { ... if (userAuthenticated) { next(); } else { req.session.loginFailed = true; console.log('setting loginFailed to true'); res.redirect('/login'); } } } 

然后在app.get('/ login')我设置req.session.loginFailed为false;

这应该工作,但我只想调用它的app.get()或app.post()等我的实际网页之一。 我认为它被许多不同的请求调用(因为在加载一个页面,'设置loginFailed为真'被称为多次)

有一个更好的方法吗? 还是应该在我网站上的每一页之前简单地调用它?

在我看来,你在那里做太多的检查。 只有一个路由应该处理用户login(如果成功,请检查用户名和密码,并在会话中保存用户名),并且只应在需要auth(不是全部)的路由上分配auth中间件。

我已经提出了一个简单的例子,所以你可以理解我的观点:

login路线

 app.post('/login', function (req, res) { var variables_set = (req.body.user && req.body.pass); if (variables_set && (req.body.user === 'username') && (req.body.pass === 'password')) { req.session.username = req.body.user; } else { res.redirect('/login?failed=true'); } }); 

auth中间件

 if (!req.session.username) { res.redirect('/login'); } else { next(); } 

您可以在Alex Young的Nodepad应用程序中看到更完整的示例: https : //github.com/alexyoung/nodepad (该应用程序的教程在这里: http ://dailyjs.com/tags.html#lmawa)