前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用nodejs的http模块创建一个简单的静态资源服务器

用nodejs的http模块创建一个简单的静态资源服务器

作者头像
挥刀北上
发布2019-07-19 15:24:01
2.1K0
发布2019-07-19 15:24:01
举报
文章被收录于专栏:Node.js开发Node.js开发

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的使用,咱们下篇文章在讨论。

以上便是用hettp模块创建一个静态服务器的简单实现,有问题欢迎大家留言。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nodejs全栈开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档