2017-04-12 60 views
0

我正在研究一个大学项目,我们决定去参考MEAN技术堆栈。说实话,我是一个初学者,NodeJSexpress,更确切地说,这是我第一次用它做。 我发现最好使用express.Router,而不是放置所有路线来表示实例,例如app.post('path', function(req, res) { ... })如何将单个中间件与多个express路由器配合使用?

所以这是我

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

正如你可以看到我有三个路由器(甚至不知道我是否有内[114]与他们太远),authRouter只处理登录和我也决定将人的逻辑与交易逻辑分开。 (也许我可以用/api/persons/:personId/transactions的方式处理新交易的创建,但我更喜欢发送所有必需的参数)。

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

Thx 干杯!

回答

0

我不明白你为什么使用3 Router s。 “通常”的路线(或者至少我走的路)是将所有路线放在同一个地方,除非路径非常不同或目的不同(例如,我将错误路线与其他路线分开) )。

例如,假设我需要建立一个REST API的应用程序,我可能会像路径:

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

所有这些途径可以在同一个Router去,如果你愿意,你可以应用特定的认证/授权中间件对他们说:

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

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

的中间件被称为序列和请求上只如果没有错误,下一个中间件(unauthenticaed/unhauthorized)通过。 然后,你可以简单地导入您的路线是这样的:

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

使用这种技术可以让你有超过你的路由细粒度控制。 希望这有助于。

相关问题