Express动态包括基于用户类型的路线

时间:2017-08-22 20:36:04

标签: node.js express

在快递中需要一些帮助或任何线索,包括/要求在运行时使用动态路由,这让我感到困惑,但我会尽我所能。

这只是现在应用路线配置的一个示例

    app.use('/',    require('./routes/public'));
    app.use('/u',   require('./routes/user'));
    app.use('/a',   require('./routes/admin'));

例如 require('。/ routes / public')将包含类似的内容

router.get('/',                     home.index);                             
router.get('/faq',                  faq.index)  

require('./ routes / user')将包含此

router.get('/dashboard',            user_home.index);                             
router.get('/accounts',             user_acc.index)

require('。/ routes / admin')

router.get('/dashboard',            adm_home.index);                             
router.get('/accounts',             adm_acc.index)

我已经安装了passportjs,因此很容易检查用户是否经过身份验证,如果是,用户包含1个属性类型,例如:1 = user,2 = admin。

req.user.type = 1或2,req.isAuthenticated()...

我需要的是注入依赖于用户类型1或2,在runetime需要('./ routes / user')或require('./ routes / admin'),因为我不想为用户声明无效路由输入用户示例,包括admin或backwards。

现在,所有路线都是可见或有效但我需要检查每个控制器的用户类型,我也不想要'/ a'OR'/ u'路由前缀。 所有路线必须在'/'。

1 个答案:

答案 0 :(得分:0)

请求运行到第一个匹配的路径。您可以渲染页面,抛出错误或调用next来获取下一个中间件。下面是一些路由器示例。

'use strict'
var express = require ('express');
var app = express();

var publicRouter = express.Router();
publicRouter.get('/', (req, res) => res.send('ROOT'));
publicRouter.get('/account', function (req, res, next) {
    if (!is-user)
        res.send('Hello guest')
    else
        next();
});

var userRouter = express.Router();
function isUser (req, res, next) {
    // return next() on user logon, and error otherwise
    return next();  
}
userRouter.use(isUser);
userRouter.get('/dashboard', (req, res) => res.send('/dashboard'));
userRouter.get('/account', (req, res) => res.send('Hello user'));

var adminRouter = express.Router();
function isAdmin (req, res, next) {
    // return next() on admin logon, and error otherwise
    return next(new Error('Access denied'));
}
adminRouter.get('/manage', (req, res) => res.send('/manage'));

app.use(publicRouter);
app.use(userRouter);
app.use('/admin', isAdmin, adminRouter); // "/admin/manage", not "/manage"

// error handler
app.use(function (err, req, res, next) {    
    res.send(err.message);
});

app.listen(2000, () => console.log('Listening on port 2000'));

另一种方式是

app.get('/', do-smth);
app.get('/dashboard', isUser, do-smth);
app.get('/manage', isAdmin, do-smth);