深入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服务器的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:深入浅出 http 与 stream

深入浅出Node.js - 理解Buffer

转 node.js里面的http模块深入理解

node.js学习目录

深入理解Node.js垃圾回收与内存管理

深入浅出Node.js--数据通讯,NET模块运行机制