• Node路由简单的处理


    看过node很多例子,都是将路由直接放到入口文件中处理,使得文件显得很大很乱,特别是当一个项目变大,有上百甚至上千的路由,那该怎么办?

    最近在想如何将一个个的路由放到一个单独的模块中处理,比如'/users'对于users模块。根据构想,写了个简单的实现,当然还有很多问题没有考虑到,后面再补充。

    目录结构:

      项目目录

        |-- routers

          |-- about.js

          |-- contact.js

          |-- index.js

        |-- router.js

        |-- server.js

    入口文件:server.js - 创建服务,调用router模块的addRoute方法添加路由。

     1 var http = require('http');
     2 var router = require('./router');
     3 
     4 router.addRoute('/', require('./routers/index'));
     5 router.addRoute('/about', require('./routers/about'));
     6 router.addRoute('/contact', require('./routers/contact'));
     7 
     8 function onListened(){
     9     console.log('Node server starts at 3000.');
    10 }
    11 
    12 function onConnected(request, response){
    13     router.handleRoute(request.url, request, response);
    14 }
    15 
    16 var server = http.createServer(onConnected);
    17 server.listen(3000, onListened);

    4-6行:其实还可以写到router.js中,可以router模块初始化是添加这些路由。这样server.js就又变得干净很多。

    router.js - 添加路由,调用路由处理函数

     1 var uuid = require('node-uuid');
     2 var http = require('http');
     3 
     4 function RouterData(route,handler){
     5     this.route = route||'';
     6     this.handler = handler||{};
     7     this.id = uuid.v4();
     8 }
     9 
    10 function Router(){
    11 
    12     var routers = [];
    13     var me = this;
    14     
    15     this.addRoute = function(route, handler){
    16         if(!route||!handler) return;
    17         var routeData = new RouterData(route, handler);
    18         routers.push(routeData);
    19     };
    20     
    21     this.handleRoute = function(route, req, res){
    22         var handler = getRouteHandlerByRoute(route);
    23         if(!handler){
    24             handle_404(route, req, res);
    25             return;
    26         }
    27         handler.exec(route, req, res);
    28     };
    29 
    30 
    31     function getRouteHandlerByRoute(route){
    32         var n = routers.length;
    33         var handler = null;
    34         for (var i = n - 1; i >= 0; i--) {
    35             if(routers[i].route === route){
    36                 handler = routers[i].handler;
    37                 break;
    38             }
    39         }
    40         return handler;
    41     }
    42 
    43     function handle_404(route, req, res){
    44         res.writeHeader(404, {
    45             'Content-Type': 'text/plain'
    46         });
    47         res.end(route+' '+http.STATUS_CODES['404']);
    48     }
    49 
    50 }
    51 module.exports = new Router();

    为了简单处理,addRoute方法只是简单的添加了路由,没有考虑到相同的情况,且在getRouteHandlerByRoute函数中的查找路由处理函数的前提是没有相同的路由,否则得用路由uid来查找。

    about.js, contact.js, index.js - 实际要处理路由的地方。

     1 function About(){
     2     this.exec = function(route, req, res){
     3         res.statusCode = 200;
     4         res.setHeader('Content-Type', 'text/html');
     5         res.end('This is </b>About Me</b>');
     6     }
     7 }
     8 
     9 
    10 module.exports = new About();
     1 function Contact(){
     2     this.exec = function(route, req, res){
     3         res.statusCode = 200;
     4         res.setHeader('Content-Type', 'text/html');
     5         res.end('This is </b>Contact Page</b>');
     6     }
     7 }
     8 
     9 
    10 module.exports = new Contact();
     1 function Index(){
     2     this.exec = function(route, req, res){
     3         res.statusCode = 200;
     4         res.setHeader('Content-Type', 'text/html');
     5         res.end('This is </b><strong>Home Page</strong></b>');
     6     }
     7 }
     8 
     9 
    10 module.exports = new Index();

    在这些模块中都实现了一个exec的方法,用于处理路由。如果更灵活处理,应该可以写一个路由处理的基类,然后再子类继承分别处理。

  • 相关阅读:
    vscode中设置Python解释器
    Python语言中当前工作目录(Current Working Directory, cwd)与模块搜索第一路径都是指什么???
    在vscode中通过修改launch.json文件为项目添加环境变量——在launch.json文件中修改env变量
    Docker 中安装的 RabbitMQ 开通STOMP通道 用于 WebSocket 的Web端连接
    初中生能看懂的微积分
    conda创建虚拟环境到指定文件夹
    Sorry, Ubuntu 16.04 has experienced an internal error
    卷积
    Mac mini和Mac studio
    linux下无法进入外加移动硬盘文件夹 No such file or directory
  • 原文地址:https://www.cnblogs.com/ywxgod/p/4032471.html
Copyright © 2020-2023  润新知