本篇内容主要讲解“如何用nodejs的http模块创建一个简单的静态资源服务器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用nodejs的http模块创建一个简单的静态资源服务器”吧!
nodejs自问世以来,基于nodejs的web开发框架层出不穷,TJ大神的express和koa,阿里的egg,360大神李成银的thinkjs等等,这些框架是学不完的。
这些框架都是基于nodejs核心模块http模块封装而来的,只不过按照业务的不同,个人代码风的不同,产生了不同的框架,今天就带大家一起用nodejs的http模块封装一个简单的http静态服务器。
在开始写代码之前,我们首先要了解http的模型,http的模型是基于请求=》处理=》响应这样的一个过程。
nodejs将客户端向服务端发送请求的过程抽象成了一个事件,我们先用代码演示一下:
此时用node命令运行这个文件,就可以返回hello world,服务器启动了。
但是这个服务器,对任何请求都是返回hello world,功能太简单了,我们结合nodejs的另外一个核心模块个,fs模块,将其改装成静态资源服务器,代码如下:
此时,我们已经初步完成了,静态资源服务器的功能,貌似完成了,我们在www目录下新建一个index.html,然后测试访问以下服务器:
访问结果如下:
为什么是这样的呢?我们看响应头:
这里并没有给我们标识正确的mime响应头,我们该如何呢?
此时需要借助一个第三方包,mime,这个包有两个方法,一个是根据url的后缀获取请求文件的mime类型一个是根据mime类型判断文件后缀,显然我们需要第一种,官方文档演示代码如下:
服务器代码更改如下:
观察上面代码,我们引入了,mime模块,获取到了文件的mime类型,然后额外增加了一个判断,如何mime类型中包含text就追加编码格式为utf8,这样做是强制浏览器按照utf8模式解析文本数据,防止浏览器按照默认编码格式解析文本。
此时运行服务器,查看结果:
查看network的响应头:
查看红框中的内容,响应头已经被设置好了。
上面的代码中有个彩蛋不知道大家有没有注意到,res.writeheader方法不仅可以设置http规范的响应头,还可以设置自定义响应头,上图中小编设置了一个clm1100的响应头。
这次貌似又完成了,但是大家想想,如果静态文件很大,我在www放了一个avi的视频,上面的代码还能正常运行吗,这将avi的大小,如果avi大小超过服务器内存,恩,服务器挂掉了。
怎么解决呢?这里用到了nodejs里面另外一个东西,stream,流。看代码:
此时观察上面的代码,我们发现这次没有使用fs的readFile方法,而是换成了,fs.createReadStream方法,将文件转化成一个stream,然后将这个流用pipe连接到了res上,然后就直接输出到客户端了,这里读取文件的方式,就是读取一块响应一块,而不是一次性的读取了。关于stream的使用,咱们下篇文章在讨论。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。