Express.js需要会话才能访问特定路由

时间:2017-08-08 03:25:09

标签: javascript node.js express

我有一个应用,其中某些页面要求用户登录。

我不确定是否有内置的内容,但我所做的是如下:

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()
})

这是正确的做法,还是有更好的表达方式?我这样做的方式有点像哈克。

2 个答案:

答案 0 :(得分:1)

是的,这是一种正确的做法。您拥有的是express中的 应用程序级中间件 。它会被应用程序收到的每个请求调用。

您可以提取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)

如果您希望通过将 express router 路由级中间件 一起使用来分离问题,可以更进一步。这也将中间件直接应用于路由。

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);

答案 1 :(得分:0)

这个解决方案的工作。它不是最好的,但对于小项目来说它会很好。唯一的缺点是您需要定义要通过会话检查的每条路线。

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

验证是我导出中间件的文件,我将其应用到我的所有路由器上..(在这种情况下,只是为了检查用户是否已登录)

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");
  }
});