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

Javascript Express.js需要会话才能访问特定路由,javascript,node.js,express,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('/

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

我不确定这里面是否有什么东西,但我要做的是:

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

这是正确的方法,还是express中有更好的方法?我做这件事的方式让人觉得有点老套。

这个解决方案很有效。这不是最好的,但对于小项目来说会很好。唯一的缺点是,您将需要定义您希望通过会话检查的每个路由

Nodejs是中间件的世界,为什么不使用中间件呢?我认为这是最好的办法

Verify是我导出中间件并将其应用于所有路由器的文件。。(在这种情况下,只是检查用户是否已登录)

这样,如果将来你需要检查一件事,然后是另一件事,你只需要在你想检查的地方调用你的函数

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

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

您可以提取
用户名
检查并将其作为路由中间件子堆栈应用。这样,中间件只对其应用到的路由执行

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

这是行不通的。可能适用于您向服务器发出的第一个请求,但此后将不起作用。
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);