我正在开展一项大学项目,我们决定采用MEAN技术堆栈。说实话,我是NodeJS
和express
的初学者,更准确地说,这是我第一次使用它。
我发现使用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令牌验证)函数传递给路由器模块并在那里使用它。
是否有更好的方法可以使用相同的中间件和多个路由器,或者这是一种合法的方式吗?
答案 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);
使用此技术可以对路线进行细粒度控制。 希望这会有所帮助。