我们打开浏览器浏览网页时,点击上面不同的模块,地址栏中的路由会发生相应的变化,从而,浏览器向服务器发起请求的内容也会发生改变,那么服务端,是如何来做的呢?

服务端也是,通过路由来做出不同的响应的,我们已经知道,服务器对象的参数有request,和response两个参数。request里就携带了,浏览器请求所携带的值。

request.url返回的是浏览器中路由的值

我们可以根据这个值来判断,服务器需要返回给浏览器什么内容,

下面来看一下server.js的代码:

var http = require("http");
var fs = require("fs"); var startServer = function(){
var onRequest = function(request,response){
console.log("request received"+request.url);
if(request.url==="/"||request.url==="/home"){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
}else if(request.url==="/review"){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
}else if(request.url==="/api"){
response.writeHead(200,{"Content-Type":"application/json"});
var jsonObj={name:"lili",job:"coder",age:18};
response.end(JSON.stringify(jsonObj));
}else{
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/404.html","utf8").pipe(response);
} } var server = http.createServer(onRequest);
//最后让服务器监听一个端口
server.listen(3000,"127.0.0.1");//还可以加第二个参数 127.0.0.1代表的是本地 console.log("server started on localhost port 3000");//加一个服务器启动起来的提示
} module.exports.startServer=startServer;

上面server.js中,根据不同的路由,让服务器返回给浏览器不同的内容,当找不到内容时,返回一个404页面

把server.js引入到app.js中

var server = require("./server");

server.startServer();

执行node app

在浏览器中 localhost:3000

后面跟上不同的路由,会显示不同的页面,当匹配不到路由时,会显示404页面!!!

路由重构过程

上面的代码又显的有些臃肿,需要来重构一下,怎么来重构呢?页面中许多路由路径,还有if判断显得有些臃肿,所以就重构它:

先从server.js开始,我们可以将这些if else判断语句注释掉,用一个函数代替

var http = require("http");
var fs = require("fs"); var startServer = function(route){
var onRequest = function(request,response){
console.log("request received"+request.url);
route(request.url);
// if(request.url==="/"||request.url==="/home"){
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
// }else if(request.url==="/review"){
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
// }else if(request.url==="/api"){
// response.writeHead(200,{"Content-Type":"application/json"});
// var jsonObj={name:"lili",job:"coder",age:18};
// response.end(JSON.stringify(jsonObj));
// }else{
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/404.html","utf8").pipe(response);
// } } var server = http.createServer(onRequest);
//最后让服务器监听一个端口
server.listen(3000,"127.0.0.1");//还可以加第二个参数 127.0.0.1代表的是本地 console.log("server started on localhost port 3000");//加一个服务器启动起来的提示
} module.exports.startServer=startServer;

那么响应的app.js中startServer函数也要传进去对应的参数

var server = require("./server");
var router = require("./router"); server.startServer(router.route);

那么app.js中传给startServer函数的route,从哪来呢?

我们重新建立一个模块,叫router.js,它里面应该导出一个route函数

route需要有一个request.url参数

如下:

function route(pathname){
console.log("Routing request for"+pathname);
} module.exports.route=route;

上面route函数的pathname参数是在server.js里调用这个函数时传进去的,而api调用startServer时,传进去的是route函数本身,并不需要传参数。

做完上面的,服务器的请求,就到route.js中了,我们需要在route.js中对服务器请求做一些响应,当然如果直接在route.js中把一些if else写进去,还是比较乱,没多大意义,我们可以再重新建立一个模块:handler.js来写这些响应代码:

重构的目的肯定是想,让代码更整洁,更“智能化”,所谓的智能化,就是你只需要改变一小点地方,代码会把相应的改变,帮自己改变,不用自己去改变更多的代码。在代码中的体现,就是封装方法,传入不一样的参数,这个方法做出不一样的操作。那么,在现在的路由中,改变的是request.url,我们需要封装一个方法,根据request.url的不同,而做出对应的响应。下面的handler.js里面,盛放的是一些,对应的函数方法。

handler.js:

function home(){
console.log("Executing 'home' handler");
} function review(){
console.log("Executing 'review' handler");
} function api_records(){
console.log("Executing 'api_records' handler");
} module.exports={
home,
review,
api_records
}

现在方法有了,需要与request.url发生对应关系,我们打算把这些对应关系放在api.js中:

api.js:

var server = require("./server");
var router = require("./router");
var handler = require("./handler"); var handle = {}; handle["/"]=handler.home;
handle["/home"]=handler.home;
handle["/review"]=handler.review;
handle["/api_records"]=handler.api_records; server.startServer(router.route,handle);

我们把路径与方法的对应关系,写在了一个handle对象中,然后传给了startServer方法内

那么,stratServer方法需要作出响应更改:

server.js:

var http = require("http");
var fs = require("fs"); var startServer = function(route,handle){
var onRequest = function(request,response){
console.log("request received"+request.url);
route(handle,request.url);
// if(request.url==="/"||request.url==="/home"){
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
// }else if(request.url==="/review"){
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
// }else if(request.url==="/api"){
// response.writeHead(200,{"Content-Type":"application/json"});
// var jsonObj={name:"lili",job:"coder",age:18};
// response.end(JSON.stringify(jsonObj));
// }else{
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/404.html","utf8").pipe(response);
// } } var server = http.createServer(onRequest);
//最后让服务器监听一个端口
server.listen(3000,"127.0.0.1");//还可以加第二个参数 127.0.0.1代表的是本地 console.log("server started on localhost port 3000");//加一个服务器启动起来的提示
} module.exports.startServer=startServer;

我们把handle对象传给了stratServer方法,然后又传给了,route方法,那么route方法,需要更改:

route.js:

function route(handle,pathname){
console.log("Routing request for"+pathname);
if(typeof handle[pathname] === 'function'){
handle[pathname]();
}else{
console.log("No handle for" + pathname);
}
} module.exports.route=route;

route方法内,判断当前路径对应的值是否是一个函数,是的话,执行这个函数,不是的话,后面处理,应该是跳转404页面,到后面处理

下一步,我们需要让handle方法做出相应,也就是响应给页面对应的内容,那么,我们就需要用到response对象,我们可以在stratServer中传给route方法:

var http = require("http");
var fs = require("fs"); var startServer = function(route,handle){
var onRequest = function(request,response){
console.log("request received"+request.url);
route(handle,request.url,response);
// if(request.url==="/"||request.url==="/home"){
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
// }else if(request.url==="/review"){
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
// }else if(request.url==="/api"){
// response.writeHead(200,{"Content-Type":"application/json"});
// var jsonObj={name:"lili",job:"coder",age:18};
// response.end(JSON.stringify(jsonObj));
// }else{
// response.writeHead(200,{"Content-Type":"text/html"});
// fs.createReadStream(__dirname+"/404.html","utf8").pipe(response);
// } } var server = http.createServer(onRequest);
//最后让服务器监听一个端口
server.listen(3000,"127.0.0.1");//还可以加第二个参数 127.0.0.1代表的是本地 console.log("server started on localhost port 3000");//加一个服务器启动起来的提示
} module.exports.startServer=startServer;

在router.js中也要穿进去:再传给handle方法:

function route(handle,pathname,response){
console.log("Routing request for"+pathname);
if(typeof handle[pathname] === 'function'){
handle[pathname](response);
}else{
console.log("No handle for" + pathname);
}
} module.exports.route=route;

这样就可以在handle中,用response对象,响应给页面内容了

var fs = require("fs");

function home(response){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
} function review(response){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
} function api_records(response){
response.writeHead(200,{"Content-Type":"application/json"});
var jsonObj={name:"lili",job:"coder",age:18};
response.end(JSON.stringify(jsonObj));
} module.exports={
home,
review,
api_records
}

此时,我们在localhost:3000  分别输入 /     /home    /review    /api_records    都会响应出不同的内容!!

下面处理一下,当没有对应路径的方法时,跳转到404页面:

在router.js中变动:

var fs = require("fs");

function route(handle,pathname,response){
console.log("Routing request for"+pathname);
if(typeof handle[pathname] === 'function'){
handle[pathname](response);
}else{
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/404.html","utf8").pipe(response);
}
} module.exports.route=route;

以上就是 重构路由代码的整个过程

成型路由代码

上线的重构过程有些乱,下面把整个路由重构后的代码帖出来:

api.js:

var server = require("./server");
var router = require("./router");
var handler = require("./handler"); var handle = {}; handle["/"]=handler.home;
handle["/home"]=handler.home;
handle["/review"]=handler.review;
handle["/api_records"]=handler.api_records; server.startServer(router.route,handle);

server.js:

var http = require("http");

var startServer = function(route,handle){
var onRequest = function(request,response){
console.log("request received"+request.url);
route(handle,request.url,response); } var server = http.createServer(onRequest);
//最后让服务器监听一个端口
server.listen(3000,"127.0.0.1");//还可以加第二个参数 127.0.0.1代表的是本地 console.log("server started on localhost port 3000");//加一个服务器启动起来的提示
} module.exports.startServer=startServer;

router.js:

var fs = require("fs");

function route(handle,pathname,response){
console.log("Routing request for"+pathname);
if(typeof handle[pathname] === 'function'){
handle[pathname](response);
}else{
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/404.html","utf8").pipe(response);
}
} module.exports.route=route;

handler.js:

var fs = require("fs");

function home(response){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
} function review(response){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
} function api_records(response){
response.writeHead(200,{"Content-Type":"application/json"});
var jsonObj={name:"lili",job:"coder",age:18};
response.end(JSON.stringify(jsonObj));
} module.exports={
home,
review,
api_records
}

上面就是成型的路由代码了,以后再添加新的路由,我们只需要该两处地方,1是,api中路径与handle方法的对应关系,2是,在handler.js中新增对应的方法!!!

比如说,我们加个text的路由,让它响应文本内容

api.js中:

var server = require("./server");
var router = require("./router");
var handler = require("./handler"); var handle = {}; handle["/"]=handler.home;
handle["/home"]=handler.home;
handle["/review"]=handler.review;
handle["/api_records"]=handler.api_records;
handle["/text"]=handler.text; server.startServer(router.route,handle);

handler.js中:

var fs = require("fs");

function home(response){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/index.html","utf8").pipe(response);
} function review(response){
response.writeHead(200,{"Content-Type":"text/html"});
fs.createReadStream(__dirname+"/review.html","utf8").pipe(response);
} function api_records(response){
response.writeHead(200,{"Content-Type":"application/json"});
var jsonObj={name:"lili",job:"coder",age:18};
response.end(JSON.stringify(jsonObj));
} function text(response){
response.writeHead(200,{"Content-Type":"text/plain;charset=UTF-8"});
response.end("文本内容");
} module.exports={
home,
review,
api_records,
text
}

ok!!!

nodejs 用http模块搭建的服务器的路由,以及路由代码的重构过程的更多相关文章

  1. 使用nodejs的net模块创建TCP服务器

    使用nodejs的net模块创建TCP服务器 laiqun@msn.cn Contents 1. 代码实现 2. 使用telnet连接服务器测试 3. 创建一个TCP的client 1. 代码实现 ; ...

  2. 使用nodejs的http模块创建web服务器

    使用nodejs的http模块创建web服务器 laiqun@msn.cn Contents 1. web服务器基础知识 2. Node.js的Web 服务器 3. 代码实现 1. web服务器基础知 ...

  3. Node.js 蚕食计划(二)—— 使用 http 模块搭建 Web 服务器

    Node.js 开发的目的就是为了用 JavaScript 编写 Web 服务器程序 这次就来介绍用 http 模块搭建服务器 一.项目构建 每个 Node 程序都可以看作一个模块,而每个模块都应该有 ...

  4. ubuntu 搭建samba服务器&挂载(mount)代码到本地

    一.搭建samba服务器 1.下载: sudo apt-get install samba samba-common 2.创建共享文件夹MyShare: mkdir /home/user/MyShar ...

  5. eventlet 模块搭建 WEB 服务器

    eventlet这个强悍的东东,看到我同事的一些整理.故贴出来,大家一起分享~ motivation 114.113.199.11服务器上nova服务中基于python eventlet实现的定时任务 ...

  6. Centos7.2 搭建Lamp服务器以及迁移WordPress个人博客详细过程

    其实自己的博客搭了有段时间了,但是由于自己不太确定是不是一定要用wd的框架,以及实验室公网服务器的不稳定,就一直荒废着. 今天偶然间看到了腾讯云对于学生的优惠活动,毕业之前每月只要8元的云服务器(就算 ...

  7. linux文件映射到windows(方便用虚拟机搭建linux服务器,用本地windows代码编辑)

    1,安装docker: https://docs.docker.com/install/linux/docker-ce/centos/ 2,linux上创建好需要共享的目录 /data/share(可 ...

  8. pm2命令,端口查询,mongodb服务启动,nginx服务启动,n模块的使用,搭建nodejs服务器环境,搭建oracledb服务器环境 linux的环境搭建

    pm2命令 pm2 ls //查询pm2 启动的列表 pm2 start app.js //启动文件 pm2 restart app //重启项目 pm2 logs app //监控项目执行日志打印 ...

  9. nodejs基础 用http模块 搭建一个简单的web服务器 响应JSON、html

    前端在开发中,大多会想浏览器获取json数据,下面来用nodejs中的http模块搭建一个返回json数据的服务器 var http = require("http"); var ...

随机推荐

  1. 基于Docker的Kafka部署

    一 准备 1.1 安装docker-dompose #部署 sudo curl -L "https://github.com/docker/compose/releases/download ...

  2. ASP.NET 使用 SyndicationFeed 输出 Rss

    以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...

  3. 【微信支付】公众号 JSAPI支付 HTML5(使用MUI前端框架)+WebApi 实现流程

    必要参数:      1) AppID,AppSecret : 在微信公众号后台管理—>(菜单栏)开发 —> 基本设置     2)商户号 :在微信公众号后台管理—>(菜单栏)微信支 ...

  4. React/数据流

    “Props” 当 React 元素为用户自定义组件时,它会将 JSX 所接收的属性(attributes)转换为单个对象传递给组件,这个对象被称之为 “props”. props的只读性 组件无论是 ...

  5. 关于H5的一些相关基础知识

    HTML只是简写全写是(Hyper Text  Markup Language)表示的是:超文本标记语言; HTML5表示的是html的第5次重大修改的第5个版本,(而html5是W3C和WHATWG ...

  6. element之 el-scrollbar组件滚动条的使用

    在使用vue + element-ui 搭建后台管理页面的时候,做了一个头部.侧栏.面包屑固定的布局,导航栏和主要内容区域当内容超出时自动滚动.

  7. XCode5环境下利用crash log调试线上Crash的流程

    1.前言 本文主要介绍在XCode5环境下,如何根据App自己生成的crashlog来调试真机上运行时产生的crash问题. 2. 步骤 (1)构造一段会crash的代码,并放到viewDidLoad ...

  8. C语言对齐、补齐

    加快CPU读取数据的速度 aligned(n) 让所作用的结构成员对齐在n字节自然边界上.如果结构中有成员的长度大于n,则按照最大成员的长度来对齐 struct s { char c; int i; ...

  9. 数据库连接池,DBUtil的模板,dbcp,c3p0

    数据库连接池,DBUtil的模板,Druid使用(重点) 一.DBUtil模板 public class DBUtilTest { public static Connection connectio ...

  10. win10锁屏壁纸文件夹Assets中无文件问题的解决方法

    一.前言 win10在锁屏时会有很多精美的壁纸,在网上查找到win10锁屏壁纸存放目录为 : C:\Users\你的用户名\AppData\Local\Packages\Microsoft.Windo ...