node chat 里面的http实现与express的http实现比较

node chat

 

node chat里面的http调用在server.js就一句话,fu.listen(PORT,HOST);

查fu.js的实现,实现逻辑跟nodejs官网的类似,主要内容有:

有一个全局变量server,直接调用createServer方法,并把逻辑放到httpServer等待callback方法:function(req,res){}

             在这个callback里面做了两件事情:

                1.对res变量绑定了simpleText和simpleJSON方法,返回text和json类型的数据给客户端。

                2.对req,res进行路由转发,转发的规则就是req.url解析出相对路径,再匹配到由get方法注册进来的handler列表上

 

nodejs官方http实现demo的关键两个方法: 一个是写头信息,一个是写body信息

 

这里顺便提一下一个很有意思的js写法。fu.staticHandler,读取静态文件给客户端请求

方法的逻辑是,传入一个带相对路径的文件名,返回一个方法,也就是handler,这个handler被get方法注册到了上面所说的handler列表了。

而fu.staticHandler本身也是一个方法,由于js里面方法即对象,所以在它里面有三个变量,body和headers数据变量和content_type文件类型变量,

它还有一个内部方法,loadResponseData,而这个方法又调用了另外一个方法fs.readFile,这个fs模块的readFIle方法又通过回调函数来共享staticHandler定义的上面的三个变量,我觉得javascript的传值方式很特别,不传值,而是传代码逻辑的方式达到传值的目的。如果用java写,我们一般会传this给这个方法,然后在自身定义这样一个回调方法,比如命名为returnData方法,然后在fs的readFile里面必须显示的调用this里面的returnData(data)这样的方式,但是this的类型必须被fs所有引用,由于javascript的弱类型语言特性,一般的代码区别如下:

 

class A{
    String body,headers;

    public void staticHandle(fileName){
       new B.readFile(fileName,this);
    }
     public void returnData(data){
        this.body=data;
    }
}

class B{
     public void readFile(fileName, A){
          String data=read(fileName);
          A.returnData(data);
    }

}
 
function A(){
    String body,headers;

   function staticHandle(fileName){
       return B.readFile(fileName,
                                 function  returnData(data){    body=data;});
    }
}

function B{
    function  readFile(fileName, callBackFunction){
          var data=read(fileName);
          callBackFunction(data);
    }

}

 

express

 

module 加载过程:express文件夹下找index.js--->lib/express.js

这个express.js导出了如下的方法:

1. createServer :对HTTP和HTTPs的封装

2. 对request和response封装,一个在lib/request.js另外一个在lib/response.js

这个request.js导出了如下方法:

req = http.IncomingMessage.prototype

req.header(name)这个基本没意义,我觉得,req.headers本来就是Map,支持搜索,无非是对大小写和referer的特殊化处理

req.params(name)对url的参数进行查询,跟上面的一样,也是对paramsMap的搜索,无意义

这个response.js导出如下方法:

res = http.ServerResponse.prototype

res.send(str) 无非是对nodejs库的writeHead和write方法的合并,没意思

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值