《Pro Express.js》學習筆記——app.params中間件

app.param中間件用於對URL中的參數進行獲取、加工、輸出,提供公有邏輯,以達到代碼重構的目的。git

 如下示例採起三個步驟對代碼進行重構,app.param中間件的做用很是明顯:
github

  1. 不使用中間件
  2. 使用自定義中間件
  3. 使用app.param中間件

不使用中間件

 1  var users = {
 2     'azat': {
 3         email: 'hi@azat.co',
 4         website: 'http://azat.co',
 5         blog: 'http://webapplog.com'
 6     }
 7 };
 8 
 9  var findUserByUsername =  function (username, callback) {
10      if (!users[username]) {
11          return callback( new Error('No user matching ' + username));
12     }
13 
14      return callback( null, users[username]);
15 }
16 
17 app.get('/v1/users/:username',  function (request, response, next) {
18      var username = request.params.username;
19     findUserByUsername(username,  function (error, user) {
20          if (error)  return next(error);
21          return response.render('user', user);
22     });
23 });
24 
25 app.get('/v1/admin/:username',  function (request, response, next) {
26      var username = request.params.username;
27     findUserByUsername(username,  function (error, user) {
28          if (error) return next(error);
29          return response.render('admin', user);
30     });
31 });

 使用自定義中間件

 1  var findUserByUsernameMiddleware =  function (request, response, next) {
 2      if (request.params.username) {
 3         console.log('Username param was detected: ' + request.params.username);
 4         findUserByUsername(request.params.username,  function (error, user) {
 5              if (error) return next(error);
 6             request.user = user;
 7              return next();
 8         })
 9     }  else {
10          return next();
11     }
12 }
13 
14 app.get('/v2/users/:username',
15     findUserByUsernameMiddleware,
16      function (request, response, next) {
17          return response.render('user', request.user);
18     });
19 
20 app.get('/v2/admin/:username',
21     findUserByUsernameMiddleware,
22      function (request, response, next) {
23          return response.render('admin', request.user);
24     });
View Code

使用app.param中間件

 1 app.param('v3Username', function(request,response,next,username){
 2     console.log('Username param was detected: '+username);
 3     findUserByUsername(username, function(error,user){
 4          if (error) return next(error);
 5         request.user = user;
 6          return next();
 7     });
 8 });
 9 
10 app.get('/v3/users/:v3Username',
11      function (request, response, next) {
12          return response.render('user', request.user);
13     });
14 
15 app.get('/v3/admin/:v3Username',
16      function (request, response, next) {
17          return response.render('admin', request.user);
18     });
View Code

 小結

  1. app.param中間件起到AOP的做用,對含有指定參數的請求進行統一攔截處理,便於集中維護管理;
  2. app.param中間件簡化了後面路由處理時的寫法,無須再次顯式調用中間件來處理,更簡約。

 源碼地址web

相關文章
相關標籤/搜索