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

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

目录结构:

  项目目录

    |-- routers

      |-- about.js

      |-- contact.js

      |-- index.js

    |-- router.js

    |-- server.js

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

 var http = require('http');
var router = require('./router'); router.addRoute('/', require('./routers/index'));
router.addRoute('/about', require('./routers/about'));
router.addRoute('/contact', require('./routers/contact')); function onListened(){
console.log('Node server starts at 3000.');
} function onConnected(request, response){
router.handleRoute(request.url, request, response);
} var server = http.createServer(onConnected);
server.listen(3000, onListened);

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

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

 var uuid = require('node-uuid');
var http = require('http'); function RouterData(route,handler){
this.route = route||'';
this.handler = handler||{};
this.id = uuid.v4();
} function Router(){ var routers = [];
var me = this; this.addRoute = function(route, handler){
if(!route||!handler) return;
var routeData = new RouterData(route, handler);
routers.push(routeData);
}; this.handleRoute = function(route, req, res){
var handler = getRouteHandlerByRoute(route);
if(!handler){
handle_404(route, req, res);
return;
}
handler.exec(route, req, res);
}; function getRouteHandlerByRoute(route){
var n = routers.length;
var handler = null;
for (var i = n - 1; i >= 0; i--) {
if(routers[i].route === route){
handler = routers[i].handler;
break;
}
}
return handler;
} function handle_404(route, req, res){
res.writeHeader(404, {
'Content-Type': 'text/plain'
});
res.end(route+' '+http.STATUS_CODES['404']);
} }
module.exports = new Router();

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

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

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

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

Node路由简单的处理的更多相关文章

  1. SPA中,Node路由优先级高于React路由

    一.问题描述 在一场面试中,面试官问到了React和Node路由之间的关系. 现在SPA(单页面应用)的使用越来越广. Node(后台)和React(前端)都有自己的路由,当我页面访问一个URL的时候 ...

  2. Node.js简单介绍并实现一个简单的Web MVC框架

    编号:1018时间:2016年6月13日16:06:41功能:Node.js简单介绍并实现一个简单的Web MVC框架URL :https://cnodejs.org/topic/4f16442cca ...

  3. node路由访问,中间件返回数据

    node路由访问,中间件返回数据 定义一个变量存放json数据,中间件接受数据 var responseData; router.use(function(req, res, next) { resp ...

  4. Python Flask框架路由简单实现

    Python Flask框架路由的简单实现 也许你听说过Flask框架.也许你也使用过,也使用的非常好.但是当你在浏览器上输入一串路由地址,跳转至你所写的页面,在Flask中是怎样实现的,你是否感到好 ...

  5. Node.js express路由简单分析

    这2天看了一点node+express的路由源码有了一点眉目,总结一下 对于app.get, 首先给出一张类图: 图1 注意每个路由有一个stack,这个stack中存放了Layer. 路由系统内有三 ...

  6. MOCK DATA -- node路由

    前后端分离,有时候后端接口给的不是很及时,这就需要前端自己mock data, 本文讲的简单的node模拟数据 api路由跳转 首先有个data.js(json)文件, 路由: 配置在dev-serv ...

  7. 用node搭建简单的静态资源管理器

    我们都知道,老牌的3p服务器都是自带静态资源管理器的.但是node不同,它没有web容器,它的路由地址和真实地址可以没有联系,所有node的优点,是可以把路由做得相当漂亮. 但静态资源管理器也是必不可 ...

  8. windows版的node.js简单示例

    1.下载node.exe放到任意目录,假设E:\nodejs\ 2.在E:\nodejs\下新建helloworld.js,输入以下内容,保存关闭 var http = require('http') ...

  9. express for node 路由route几种实现方式的思考

    1.路由实现方式和顺序 express框架创建的模板app,js中默认代码 var express = require('express'); var routes = require('./rout ...

随机推荐

  1. java多线程并发控制countDownLatch和cyclicBarrier的使用

    java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...

  2. 公共技术点( View 绘制流程)

    转载地址:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b253f 本文为 Android 开源项目源码解析 公共技术点中的 View 绘制流 ...

  3. MySql中插入乱码问题解决

    今天在使用Java写入数据库时候,发现Insert语句和Update语句在执行过后,数据库中中文显示的是“??”,经过一番查阅,其中关键的问题在于编码格式是否统一. 其中创建表时候,每个关键字的格式都 ...

  4. 世界上最短的bash脚本

    世界上最短的bash脚本长这样: #!/bin/bash 为啥呢?见下图: 推荐一篇文章,讲解为啥shell脚本开头总是"#!/bin/bash".文风太清奇,不好翻译,看原文吧: ...

  5. 【转载】CentOS中crontab定时计划任务的使用

    转载自:http://blog.csdn.net/testcs_dn/article/details/48780971 概述 利用“任务计划”,可以将任何脚本.程序或文档安排在某个最方便的时间运行.通 ...

  6. Semaphore 信号量

    一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...

  7. nginx报错整理

    一. 1.线上有个域名出现一个访问报错: 413 Payload Too Large 这里贴一下关于这个报错的解释: The 413 (Payload Too Large) status code i ...

  8. Java设计模式学习记录-原型模式

    前言 最近一直在面试,也没时间写博客了,感觉已经积攒了好多知识想要记录下来了,因为在面试中遇到的没答出来的问题,这就是自己不足的地方,然后就要去学习这部分内容,虽然说自己不足的地方学习了,但是没有应用 ...

  9. Java基本——数据类型

    一.创建一个简单的Java应用程序 public class Code { public static void main(String[]args) { System.out.println(&qu ...

  10. 常见Java问题二

    1.什么是B/S架构?什么是C/S架构? B/S browser/server Web应用程序 C/S Client/Server 桌面应用程序 2.String str="www" ...