如何使用多个快速路由器的单片中间件?

时间:2017-04-12 11:31:58

标签: node.js express authorization

我正在开展一项大学项目,我们决定采用MEAN技术堆栈。说实话,我是NodeJSexpress的初学者,更准确地说,这是我第一次使用它。 我发现使用express.Router比使用所有路由来表达实例更可取,例如app.post('path', function(req, res) { ... })

所以这就是我所拥有的

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

function authorizationMiddleware(req, res, next) {
...
}

// handles login, doesn't meed autorizationMiddleware
var authRouter = express.Router();
authRouter.route('/login')
    .post(function (req, res) {
    ...
    });

// handles fetching of a single, all person(s), fetching of transactions for a person
var personRouter = require('./routes/personRoutes')(Person, Transaction, autorizationMiddleware);
//handles adding of a new transaction e.g. POST /api/transactions where params such as sender, recipient and amount are passed in body
var transactionRouther = require('./routes/transactionRoutes')(Person, Transaction, autorizationMiddleware);

app.use('/api', authRouter);
app.use('/api/persons', personRouter);
app.use('/api/transactions', transactionRoutes);

app.listen(8080, function () {
    console.log('Listening on port: ' + 8080);
});

正如你所看到的,我有三个路由器(甚至不确定我是否将gonne放得太远),authRouter仅处理登录,我也决定将人逻辑与事务逻辑分开。 (也许我可以像/api/persons/:personId/transactions那样处理新事务的创建,但我更喜欢在体内发送所有必需参数的想法。

我想问你是否同意我试过的解决方案。正如您所看到的,我正在将authrizationMiddleware函数(处理JWT令牌验证)函数传递给路由器模块并在那里使用它。 是否有更好的方法可以使用相同的中间件和多个路由器,或者这是一种合法的方式吗?

提前谢谢 干杯!

1 个答案:

答案 0 :(得分:0)

我不明白你使用3 Router的原因。 "常见"要走的路(或至少我去的方式)是将所有路线放在同一个地方,除非路径非常不同或目的不同(例如我将错误路线与其他路线分开)。

例如,让我们说我需要为应用程序构建一个rest api,我可能会有这样的路径:

/users/:userid
/users/:userid/comments/:commentid
/locations
...

所有这些路由可以使用相同的Router,如果需要,您可以将特定的身份验证/授权中间件应用于它们:

router.get("/users/:userid", 
        doAuthentication, authorizeOnUserId, 
        userController.getUserById);

router.get("/locations", 
        doAuthentication, authorizeLocations, 
        locationController.getAllLocations);

中间件按顺序调用,只有在没有错误(unauthenticaed / unhauthorized)的情况下才会将请求传递给下一个中间件。 然后你可以简单地导入你的路线:

app.use('/api', router);

使用此技术可以对路线进行细粒度控制。 希望这会有所帮助。