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方法的合并,没意思