深入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配置,后端就不用手动配置静态资源缓存了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderlin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值