node.js和express – 使用多个中间件与callback – 最佳实践是什么?

我有一个关于构build一个HTTP服务的问题,需要在运行实际function之前运行一些预先检查(如果其中一个预检不通过,不运行该function)。

例如,首先检查请求是否被授权,然后检查权限,并且只有在两个通行证都运行实际的function。 我可以想出两种方法来做到这一点,无论是作为中间件,还是使用callback书写授权和权限。

快递的最佳做法是哪种? 使用中间件看起来更优雅,但是更好吗? 这两种解决scheme有什么优点和缺点?

使用callback将如下所示:

router.get( '/myResource',, function(req, res){ autorizationCB(function(err, data){ if (err) { return res.status(401).json({message: err.message}); } permissionsCB(function (err, data) { if (err) { return res.status(403).json({message: err.message}); } // actual resource code... }); }); }); function authorizationCB(callback) { // check authorization ... ... if (authorized) { return callback(null, data); } else { return callback({message: 'some authorization error msg'}); } } function permissionsCB(callback) { // check permissions ... ... if (permitted) { return callback(null, data); } else { return callback({message: 'some permissions error msg'}); } } 

中间件看起来像这样:

 router.get('/myResource', authurizationMW, permissionsMw, function(req, res){ // actual resource code... }); function authorizationMW(req, res, next) { //check if authorized ... ... if (authorized) { next(); } else { res.status(401).json({message: 'not authorized'}); } } function permissionsMW(req, res, next) { //check if permitted ... ... if (permitted) { next(); } else { res.status(403).json({message: 'no permissions'}); } } 

实际上,中间件正是出于这些目的,使用它们不需要为每条路由添加所需的中间件,您可以将它们添加到路由器,它们只会在路由器下面调用路由:

 app.use('/user', authorizationMW, permissionsMW, require('./routes/user')); 

我没有看到你提到的任何callback策略。 缺点是,你的代码不可读,有许多嵌套的层次,你必须重复所有这些代码到路由器上的每个路由!

中间件更可重用。 我实际上会做这样的事情,例如如何更好的重用:

 var secureRouter = ... secureRouter.use(authorizationMW); secureRouter.use(permissionsMW); var appRouter = .... secureRouter.use(appRouter); //all routes are protected.... appRouter.get('/myResource', function(req, res){ // actual resource code... }); ); appRouter.get('/myResource2', function(req, res){ // actual resource code... }); ); //.. so on....