一个网站加载过程的大致流程如下:用户通过浏览器向指定的宿主服务器发送http请求,接收请求,解析处理请求,服务器处理完成后,返回相应的数据给用户机器浏览器接收服务器返回的数据,根据接收到的数据进行分析处理。最简单的web服务器我们需要搭建一个http服务器来处理用户发送的http请求,在node中有一个http核心模块,可以通过简单的几句话来帮助我们启动一个服务器。//导入http模块:varhttp=require('http');//创建http服务器,并传入回调函数:varserver=http.createServer(function(request,response){//回调函数接收请求和响应Object,console.log('Thereisaclientrequest...');//将HTTP响应200写入response,并设置Content-Type:text/html:response.writeHead(200,{'Content-Type':'text/html'});//将HTTP响应的HTML内容写入response:response.write('
helloWorld!
');response.end();});//让服务器监听8888端口:server.listen(8888);console.log('Serverisrunningathttp://127.0.0.1:8888/');通过这几行代码,我们搭建了一个简单的服务器,运行起来,访问地址可以显示熟悉的helloWorld!在浏览器中,迈出第一步。先看几个重要的地方:核心方法的创建和监听首先我们看一下创建http服务器的代码:varserver=http.createServer([requestListener]):创建并返回一个HTTP服务器对象requestListener:listen给clients终端连接的回调函数这里可以看到我们的回调函数是可选的,我们也可以使用事件监听器监听client连接后的操作,比如:server.on('request',function(req,res){//do....})用户访问时我们要做的事情会在这里。看监听端口的代码。这里我们简单的写了监听端口,它的选项都没有设置server.listen(port,[hostname],[backlog],[callback]):监听客户端的连接请求,只有监听方法为calledport:监听端口hostname:主机名(IP/域名),optionalbacklog:连接等待队列的最大长度,optionalcallback:调用listen方法,成功监听开启后,会触发一个监听事件,并且回调将用作事件的执行函数。它是可选的。看完了创建和监听的方法,我们来看一下。我们在监听回调函数server.on('request',function(req,res){//do....})看到有两个参数request和response,在这两个参数中,我们可以得到一些用户当前请求的信息,比如header信息,数据等待,还可以输出并返回响应给请求的客户端,我们来看看请求对象参数的内容请求对象是一个实例http.IncomingMessage,通过它我们可以得到这个请求的一些信息,比如header信息,data,url参数等等,这里简单的罗列一下最常见的:httpVersion:使用的http协议的版本headers:数据中的数据请求头信息url:请求地址method:请求方法response对象参数response对象是http.ServerResponse的一个实例(是HTTP服务器内部创建的对象),通过它我们可以返回一个response到此请求的客户端输出。response.writeHead(statusCode,[reasonPhrase],[headers]):回复请求的响应头。该方法在当前请求中只能使用一次,必须在response.end()之前调用。statusCode:三位数的HTTP状态码,如404reasonPhrase:自己设置http响应状态码对应的原因短语headers:响应头的内容write(chunk,[encoding]):发送一个数据块到响应文本,如果调用此方法但未调用response.writeHead(),它将切换到默认标题模式并更新默认标题。chunk可以是字符串或缓存。如果chunk是字符串,则第二个参数指示如何将字符串编码为比特流。默认编码为“utf8”。end([data],[encoding]):当所有的text和header信息都发送完后,调用这个方法告诉服务器所有的数据已经发送完毕。该方法必须在每条消息发送后调用,并且是最后一次调用。如果指定了参数data,相当于先调用response.write(data,encoding)再调用response.end()setHeader(name,value):为默认或已有的header设置一个单独的header:如果这个header已存在于要发送的标头中,它将覆盖原来的内容。如果我想设置更多的标题,我使用一个具有相同名称的字符串数组,例如:response.setHeader("Set-Cookie",["type=ninja","language=javascript"]);看了那么多API,该练练手了,对原来的代码做些改动吧~//importhttp模块,url模块varhttp=require('http');varurl=require('url')//createhttpservervarserver=http.createServer();server.on('request',function(req,res){//将HTTP响应200写入响应,并设置Content-Type:text/html:res.writeHead(200,{'Content-Type':'text/html'});varurlObj=url.parse(req.url);//根据用户switch访问的url显示不同的页面(urlObj.pathname){//这是主页case'/':res.write('
这是主页
');break;case'/user':res.write('
这是个人主页center
');break;default:res.write('
你要找的页面丢失~
');break;}//将HTTP响应的HTML内容写入response:res.end();});server.listen(8888);console.log('服务器运行在http://127.0.0.1:8888/');启动js文件,使用不同后缀的url,比如/和/user去访问这个地址,看浏览器的输出,应该是变了这是通过简单的url处理实现的路由机制。url处理响应不同的html。当然,让我们在这里更深入一点!结合node的文件系统(fs模块),不同的url可以直接读取不同的html文件。示例:准备工作:在当前文件目录下新建一个html文件夹,添加文件index.html和user.html,内容自行播放varhttp=require('http');varurl=require('url');varfs=require('fs');varserver=http.createServer();//读取我们当前文件所在目录下的html文件夹varHtmlDir=__dirname+'/html/';server.on('request',function(req,res){varurlObj=url.parse(req.url);switch(urlObj.pathname){case'/'://主页sendData(HtmlDir+'index.html',req,res);break;case'/user'://用户主页sendData(HtmlDir+'user.html',req,res);break;default://处理其他情况sendData(HtmlDir+'err.html',req,res);break;}});/***读取html文件,响应数据,发送到浏览器*@param{String}file文件路径*@param{Object}reqrequest*@param{Object}res响应对象*/functionsendData(file,req,res){fs.readFile(file,function(err,data){if(err){res.writeHead(404,{'content-type':'text/html;charset=utf-8'});res.end('
你要找的页面不见了~
');}else{res.writeHead(200,{'content-type':'text/html;charset=utf-8'});res.end(数据);}});}server.listen(8888);console.log('服务器运行在http://127.0.0.1:8888/');运行文件,切换url,程序会返回不同的页面给大家自己试试看!这是学习node的http模块,理解有限。如有错误请指出,谢谢!本文地址:https://guowenfh.github.io/2016/10/15/node-http/