之前写过一个用net模块构建的微型服务器,👉链接
现在用http模块来重构一下。👉GitHub仓库
http模块的初步使用
配置文件server.conf,用以配置服务器信息👇
1 | port=12306 |
其中的静态资源信息用以后面判断请求是静态资源还是动态资源。
静态资源主要就是一些写好固定的文件,比如写好的html文件、图片、css、js等,
动态资源就涉及到了可能会与业务逻辑处理有关,需要ajax处理或者涉及数据库,动态生成的数据。
这里我们暂且简化概念,把后缀名为.html|.js|.css|.jpg|.png|.gif|.ico|.json
的路径请求视为静态数据,其余的视为动态。具体由不同的操作,下文会处理。
配置文件处理config.js,用以处理配置文件信息👇
1 | var fs = require('fs'); |
处理完配置文件后导出,长这个样子👇
duntengServer.js 服务器端文件👇
1 | var http = require('http'); |
接下来尝试启动它,浏览器访问http://127.0.0.1:12306/index.html?a=1&b=3
终端输出如下👇
处理静态数据请求
从上一步可以得到浏览器的请求头信息,最主要的就是我们服务端知道了浏览器想要得到index.html
的内容,并可以判断出是静态数据请求还是动态数据请求:
写个html文件/page/login.html
👇
1 | <!DOCTYPE html> |
duntengServer.js👇
1 | var http = require('http'); |
启动duntengServer.js,浏览器访问<http://127.0.0.1:12306/login.html
浏览器如下👇
在服务器终端打印出以下信息👇
1 | node duntengServer.js |
可见,每请求一次静态数据就会创建对应的http链接,这里一共建立了两个http请求链接,分别是对login.html
和cheng.png
的
处理动态数据请求
到这一步为止,就完成了对客户端请求静态数据的响应处理,接下来搞一下动态的数据请求处理。
这里以一个ajax请求为例子。
page/login.js👇
1 | window.onload = function () { |
这样login.js
就触发了对http://127.0.0.1:12306/getData的请求,这个路径都不符合server.conf
中对静态数据的限定,所以视为动态请求。
在login.html
中引入login.js
👇
1 |
|
duntengServer.js
中处理动态数据请求,将其路径名称打印出来👇
1 | var http = require('http'); |
启动之,浏览器访问http://127.0.0.1:12306/login.html,可以看到👇
可以看到对动态请求的监测和处理是成功了。
从duntengServer.js中抽离出业务处理代码
上文中客户端发起了数据请求,比如login.html-->login.js-->ajax
我们直接在duntengServer.js
中处理了针对它的业务处理(打印出了/getData的路径),但是这是不合适的,对于这种业务处理的代码应该交由/web/loginController.js
来处理。所以应该在/web/loginController.js
中写针对login这一功能
的业务处理代码,然后在duntengServer.js
中require这个/web/loginController.js
。如下👇
📌/web/loginController.js:
1 | function getData(data) { |
📌duntengServer.js:
但是如果一个项目里面除了login,还有其他很多的业务操作,像上面这样子一个一个地往duntengServer.js
里手动引入会很繁琐,所以要想办法自动引入👇
进一步优化实现自动识别路径和处理方法的映射
项目分层架构
📌创建一个/loader.js
,它负责将/web
下所有业务处理 js 文件中的路径与方法函数之间的映射存进一个Map中👇
1 | var fs = require('fs'); |
📌web/loginController.js
1 | var path = new Map(); |
📌web/test.js
1 |
|
📌duntengServer.js
启动服务器duntengServer.js,浏览器访问http://127.0.0.1:12306/login.html👇
浏览器访问http://127.0.0.1:12306/testA和<http://127.0.0.1:12306/testB 👇
生成运行日志
📌 log.js:
1 | var fs = require("fs"); |
在duntengServer.js
中引用log.js
,在服务启动的时候调用log函数进行日志的更新写入。