Page 103 - Node.js开发指南
P. 103

96  第 5 章  使用 Node.js 进行 Web 开发


                 但当你访问任何被这两条同样的规则匹配到的路径时,会发现请求总是被前一条路由规
             则捕获,后面的规则会被忽略。原因是 Express 在处理路由规则时,会优先匹配先定义的路
             由规则,因此后面相同的规则被屏蔽。
                 Express  提供了路由控制权转移的方法,即回调函数的第三个参数next,通过调用
             next(),会将路由控制权转移给后面的规则,例如:

                 app.all('/user/:username', function(req, res, next) {
                   console.log('all methods captured');
                   next();
                 });
                 app.get('/user/:username', function(req, res) {
                   res.send('user: ' + req.params.username);
                 });

                 当访问被匹配到的路径时,如 http://localhost:3000/user/carbo,会发现终端中打印了 all
             methods captured,而且浏览器中显示了 user: carbo。这说明请求先被第一条路由规
             则捕获,完成 console.log 使用 next() 转移控制权,又被第二条规则捕获,向浏览器
             返回了信息。
                 这是一个非常有用的工具,可以让我们轻易地实现中间件,而且还能提高代码的复用程
             度。例如我们针对一个用户查询信息和修改信息的操作,分别对应了 GET 和 PUT 操作,而
             两者共有的一个步骤是检查用户名是否合法,因此可以通过 next() 方法实现:


                 var users = {
                   'byvoid': {
                     name: 'Carbo',
                     website: 'http://www.byvoid.com'
                   }
                 };

                 app.all('/user/:username', function(req, res, next) {
                   // 检查用户是否存在
                   if (users[req.params.username]) {
                     next();
                   } else {
                     next(new Error(req.params.username + ' does not exist.'));
                   }
                 });
                 app.get('/user/:username', function(req, res) {
                   // 用户一定存在,直接展示
                   res.send(JSON.stringify(users[req.params.username]));
                 });
                 app.put('/user/:username', function(req, res) {
                   // 修改用户信息
                   res.send('Done');
                 });
   98   99   100   101   102   103   104   105   106   107   108