如何创建一个基于Node的HTTP服务器

发布日期:2019-03-19

首先创建一个HTTP服务器。

var http = require("http")function serve(requestresponse) { console.log(request.method) //请求的方法 console.log(request.url) //请求里的url只含有路径名,并不是完整的url console.log(request.header) //获取请求头 response.statusCode = 200 //设置响应类型,编码为utf-8。 //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析。不指定的话可能会造成乱码 response.setHeader("Content-Type""text/htmlcharset=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(requestresponse) { var url = request.url//设置响应类型,编码为utf-8。 //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 response.setHeader("Content-Type""text/htmlcharset=utf-8") //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 fs.readFile("index.html"function(errdata) { response.write(data) response.end() })}

但是这样又有一个问题,就是:在对返回的HTML代码开始解析时,解析过程中如果遇到引用的服务器上的资源(额外的CSS,JS代码,图片等资源),需要再次向服务器发送请求,但是不管是发送什么请求,服务器返回的都是index.html文件。这时,我们就需要对不同的请求资源做一个判断,让其返回不同类型的资源。

function serve(requestresponse) { var url = request.url if (url == "/") { //设置响应类型,编码为utf-8。 //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 response.setHeader("Content-Type""text/htmlcharset=utf-8") //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 fs.readFile("index.html"function(errdata) { response.write(data) response.end() }) }else if (url == "/style.css") { response.setHeader("Content-Type""text/csscharset=utf-8") //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 fs.readFile("style.css"function(errdata) { 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(requestresponse) { var url = request.url if (url == "/") { //设置响应类型,编码为utf-8。 //服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析 response.setHeader("Content-Type""text/htmlcharset=utf-8") //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 fs.readFile("index.html"function(errdata) { response.write(data) response.end() }) }else{ static(urlresponse) } }function static(urlresponse) { response.setHeader("Content-Type"mime.lookup(url) + "charset=utf-8") //如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件 fs.readFile(url.slice(1)function(errdata) { 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模块学习小结