Express.js要求会话访问特定的路由

我有一个应用程序在某些页面需要用户login。

我不知道是否有内置的东西,但我这样做是这样的:

app.use((req, res, next) => { if (req.session.username) { app.get('/project/create', projectCtrl.create) app.get('/project/create/save', projectCtrl.save) } else { return res.redirect('/') } next() }) 

这是做这件事的正确方法,还是有更好的方法expression? 我这样做的方式感觉有点哈克。

是的,这是一个正确的方法。 你所拥有的是一个应用程序级别的中间件 。 它会被应用程序收到的每个请求调用。

您可以提取username检查并将其用作路由中间件子包 。 这样中间件只会被应用到路由上。

 function gatePass(req, res, next) { if(req.session.username) { next(); } else { return res.redirect('/'); } } app.get('/project/create', gatePass, projectCtrl.create) app.get('/project/create/save', gatePass, projectCtrl.save) 

如果您想通过使用快速路由器路由级中间件来分离关注,则可以进一步深入研究。 这也直接将中间件应用到路由。

 var router = express.Router(); router.use('/project/create', gatePass); router.use('/project/create/save', gatePass); router.get('/project/create', projectCtrl.create); router.get('/project/create/save', projectCtrl.save); app.use('/', router); 

此解决scheme工作。 这不是最好的,但对于小项目来说,这将是好的。 唯一的缺点是你将需要定义每个你想要检查的路线。

Nodejs是中间件的世界,为什么不使用它呢? 我认为这是最好的事情。

validation是一个文件,我导出我的中间件,我将其应用在我的所有路由器上(在这种情况下,它只是检查用户是否login)

 var verify = require('./verify'); router.all('/*', verify.isLogged, function(req, res, next) { if(req.decoded._doc.isLogged == "") { next(); } else { res.json("error"); } }); 

这样,如果将来你需要检查一件事,那么另一件事,你只需要打电话给你想要检查的地方

 router.get('/test', verify.isLogged, verify.isAdmin function(req, res, next) { if(req.decoded._doc.isAdmin == "") { next(); } else { res.json("error"); } });