深入node.js 6 node中的Http服务器
Posted lin-fighting
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入node.js 6 node中的Http服务器相关的知识,希望对你有一定的参考价值。
http
node中提供了http模块来创建服务。
http模块内部是基于tcp的(net)模块,内部基于socket来通信,http会增加一些header信息,请求来了之后需要在socket中读取数据,并解析成请求头。 http主要就是在socket的基础上封装了header信息,还有解析请求,响应数据
基本使用
const http = require("http");
const server = http.createServer((req, res) =>
console.log(req.headers);
);
server.on("request", () =>
console.log(123);
);
server.listen(4000, () =>
console.log("server is run 4000");
);
服务器必须有一个启动的端口监听。
req可读流
需要掌握的api:
- req.method 请求方法大写
- req.query; req.params get请求的一些参数
- req.url 不包含域名的请求路劲,默认是/,表示服务端根路劲
url 由多部份组成,host, port,hostname,hash,search: ‘?a=1’; query: ‘a=1’; pathname: ‘/a’; path: ‘/a?a=1’; href: '/a?a=1’等
http://username:password@www.baidu.com:80?a?a=1 - req.headers 获取浏览器的请求头,node中都是小写的。
- post,put的请求有请求体,可以通过req.on(‘data’)获取,req.end判断传输是否结束, req是可读流,可以监听数据。
res 可写流
需要掌握的api
- res.statuCode http码,statuMessage http码描述
- res.setHeader 设置响应头
- res.wirte() 写入响应的信息,需要通过res.end返回去,不然服务器不会响应信息。
- res.end(‘ok’) 结束,返回数据回去客户端,参数会跟随write写入的内容拼接起来返回给客户端。end = write + close
http-server的使用
用于把当前所有文件的目录类列出来,并且可以启动一个服务来展现。
npm i http-server -g
实现一个http-server
要想在命令行中输入启动,需要借助commander库。
node中操作系统 os库。
其中netwrokInterfaces可以获取分配的IPv4地址。
- 第一步:
配置package.json文件的Bin属性,在命令行执行fs的时候执行bin下面的www.js文件。
在文件顶部输入#! /usr/bin/env node表示用node运行这个文件,然后执行npm link将我们配置的fs添加到全局的npm链接下,这样就可以在命令行输入fs,他就会执行www.js这个文件。 - 第二步:
配置默认值,如port,gizp等等。
借助commonder这个库,可以实现对命令行的一些操作,如上是对–help的一些设置
可以使用program.options。
通过program.progress可以解析用户在命令行输入的参数,如fs --port 3000 => port: 3000
- 第三步:
命令行编写完毕之后,需要开启一个服务,像http-server。
思路就是:开启一个服务,等待客户端发送的请求地址,拿到对应的路劲,去匹配对应的文件/文件夹。文件就直接返回,文件夹就返回一个目录结构。
getIp用来获取当前计算机被分配的Ipv4地址。借助Os库。
接着创建server这个类。
start方法会启动一个服务,里面的this.handleRequest是用来监听用户请求的request事件。相当于server.on(‘request’,xxx)
当用户输入地址之后,浏览器像服务端发送信息,获取请求路劲,this.dorectory指向当前的工作目录,他的默认值是process.cwd(),然后拼接起来找到正确的文件路劲,需要结束fs.stat来判断是文件/文件夹。报错就证明不在,catch捕获。
文件的话比较好处理:statObj.isFile()
只需要通过可读流将内容读取出来,然后通过mime判断路劲的文件类型,设置返回头。然后通过管道pipe流入res去响应。
文件夹的话:statObj.isDirecotry()为true,
我们设置让其返回当前文件夹下的目录。如,通过fs.readdir获取目录,然后使用ejs模板渲染html。
最后设置返回头和响应内容就完成了。效果如:
访问8080,默认是根目录下的文件,
点击server.js,返回了当前文件的内容。这样http-server就初步完成了。还可以继续优化缓存相关的内容。
http-cache
http的304,一般是强缓存和协商缓存。
- 强缓存就是设置Cache-Control为max-age=10,表示10s之内,不要来找服务器要静态资源文件,强制走缓存,但是第一次浏览器刷新的时候或者输入网址不会走缓存。
- 协商缓存就是设置 Cache-Control为no-cache,表示强制浏览器不走缓存,每次都要向服务器请求,这时候再搭配Last-Modify或者Etag就可以使用了,比如设置Last-Modify为一个时间段(一般是文件的修改时间),然后浏览器下次请求的时候就会携带一个”if-modified-since“来找服务器比对,看看文件是否修改,没有的话就返回304,让浏览器走缓存,有的话就重新设置Last-Modify头,然后返回新的文件内容。etag指纹也是同样的道理。
http-cache的实现
我们自己实现一个服务来实现这个缓存效果,在开发中他们一般在nginx配置,后端就不用手动配置静态资源缓存了。
以上是关于深入node.js 6 node中的Http服务器的主要内容,如果未能解决你的问题,请参考以下文章