首先创建一个HTTP服务器。
var http = require(‘http‘);function serve(request,response) { ???console.log(request.method); ???//请求的方法 ???console.log(request.url); ?//请求里的url,只含有路径名,并不是完整的url ???console.log(request.header) //获取请求头 ???response.statusCode = 200; ?????//设置响应类型,编码为utf-8。 ???//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析。不指定的话可能会造成乱码 ???response.setHeader(‘Content-Type‘,‘text/html;charset=utf-8‘); ???response.setHeader(‘name‘,‘zfpx‘); ???response.write(new Date().toString()); ???response.end();}var server = http.createServer(serve);server.listen(3000);
如果我们希望读取其他文件的内容,则需要先导入fs模块,该模块是读取文件的模块。
var fs = require(‘fs‘);
function serve(request,response) { ???var url = request.url;//设置响应类型,编码为utf-8。 ???//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 ???response.setHeader(‘Content-Type‘,‘text/html;charset=utf-8‘); ???//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 ???fs.readFile(‘index.html‘,function(err,data) { ???????response.write(data); ???????response.end(); ???})}
但是这样又有一个问题,就是:在对返回的HTML代码开始解析时,解析过程中如果遇到引用的服务器上的资源(额外的CSS,JS代码,图片等资源),需要再次向服务器发送请求,但是不管是发送什么请求,服务器返回的都是index.html文件。这时,我们就需要对不同的请求资源做一个判断,让其返回不同类型的资源。
function serve(request,response) { ???var url = request.url; ???if (url == ‘/‘) { ???????//设置响应类型,编码为utf-8。 ???????//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 ???????response.setHeader(‘Content-Type‘,‘text/html;charset=utf-8‘); ???????//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 ???????fs.readFile(‘index.html‘,function(err,data) { ???????????response.write(data); ???????????response.end(); ???????}) ???}else if (url == ‘/style.css‘) { ???????response.setHeader(‘Content-Type‘,‘text/css;charset=utf-8‘); ???????//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 ???????fs.readFile(‘style.css‘,function(err,data) { ???????????response.write(data); ???????????response.end(); ???????}) ???}
一个页面里,我们可能会请求非常多的静态资源,如果每次都加一个else if 显然让页面更复杂,且不利于维护。所以我们希望将所有的静态资源请求都封装在一个函数里。
function parseMime(pathname) { ???var reg = /\.(HTML|JS|CSS|JSON|TXT|ICO|JPG)/i; ???if (reg.test(pathname)) { ???????//获取请求文件的后缀名 ???????var suffix = reg.exec(pathname)[1].toUpperCase(); ???????//根据请求文件的后缀名获取到当前文件的MIME类型 ???????var suffixMIME = "text/plain"; ???????switch(suffix) { ???????????case "HTML": ???????????????suffixMIME = "text/html"; ???????????????break; ???????????case "CSS": ???????????????suffixMIME = "text/css"; ???????????????break; ???????????case "JS": ???????????????suffixMIME = "text/javascript"; ???????????????break; ???????????case "JSON": ???????????????suffixMIME = "application/json"; ???????????????break; ???????????case "ICO": ???????????????suffixMIME = "application/octet-stream"; ???????????????break; ???????????case "JPG": ???????????????suffixMIME = "image/jpg"; ???????????????break; ???????????????????} ???} ???return suffixMIME;}
实际上,Node中还提供了一个第三方的模块能够自动帮我们判断文件的MIME类型,我们这里还需要用到一个第三方的模块"mine"。
var mime = require(‘mime‘);function serve(request,response) { ???var url = request.url; ???if (url == ‘/‘) { ???????//设置响应类型,编码为utf-8。 ???????//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 ???????response.setHeader(‘Content-Type‘,‘text/html;charset=utf-8‘); ???????//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 ???????fs.readFile(‘index.html‘,function(err,data) { ???????????response.write(data); ???????????response.end(); ???????}) ???}else{ ???????static(url,response) ???} ???}function static(url,response) { ???response.setHeader(‘Content-Type‘,mime.lookup(url) + ‘;charset=utf-8‘); ???//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 ???fs.readFile(url.slice(1),function(err,data) { ???????response.write(data); ???????response.end(); ???}) ???}
现在我们的url都是类似http://localhost:3000/index.html这样的,就是客户端只是单纯的获取数据,并不涉及向服务器端发送数据。
前面我们说过,request.url获取的是‘3000:‘之后的内容,那么当我们需要向服务器传一些内容的时候,比如说http://localhost:3000/index.html/?name="xiaoyu"。这时request.url获取的就是/index.html/?name="xiaoyu"。
这样的url显然不能再作为我们判断路径的依据,所以我们得进一步处理这个url。其实node提供了一个更加强大的url解析库给我们,这个库就是”url“。这个库能够解析整个完整的url路径。
传送地址:url模块学习小结
如何创建一个基于Node的HTTP服务器
原文地址:https://www.cnblogs.com/yuliangbin/p/9429062.html