从头开始学习Node.js系列教程中设置HTTP头的示例
本文演示了通过Node.js设置HTTP头的方法,分享给大家参考,如下所示:
server.js
//基本服务器的//配置文件var port=3000;var server=require('。/basis server ')。createServer();server.useFavIcon('localhost ',')。/docroot/fav icon . png ');server.addContainer('。* ',/l/(。*)$ ',必选('。/redirector '),{})server.docroot('localhost ','/','。/docroot ');//server.useFavIcon('127.0.0.1 ',')。/docroot/fav icon . png ');//server.docroot('127.0.0.1 ','/',')。/docroot ');server.listen(端口);basicserver.js
响应头服务器将其发送给客户端
文件扩展名不足以正确识别文件类型,文件扩展名也没有标准,所以人们设计了Content-Type头和整个MIME类型标准作为数据类型表示系统。
对于一些应用程序,尤其是一些处理固定数据的小应用程序,我们可以确切地知道使用哪个Content-Type头,因为应用程序发送的数据是特定已知的。然而,staticHandler可以发送任何文件,并且通常不知道使用哪种内容类型。这个问题可以通过匹配文件扩展名列表和Content-Type来解决,但是这个方案并不完善。最佳做法是使用外部配置文件,该文件通常由操作系统提供。
MIME npm包使用Apache项目的MIME.types文件,该文件包含600多个与内容类型相关的数据。如有必要,mime模块还支持添加自定义mime类型。
npm安装mime
var mime=require(' mime ');var MiMe type=mime . lookup(' image . gif ');//==image/gifres . setheader(' Content-Type ',mime Type);一些相关的HTTP头:
当对内容编码数据进行编码时使用,例如,gzipContent-Language Content-Location中使用的语言Content-Length的字节数可以得到Content-MD5的内容主题的MD5校验和,即数据的候选位置。
HTTP协议是无状态的,这意味着web服务器无法识别不同的请求发送者。如今,常见的做法是服务器向客户端浏览器发送cookie,登录用户的身份在cookie中定义。对于每个请求,网络浏览器将发送对应于所访问网站的cookies。
发送Cookie时,我们应该为Set-Cookie或Set-Cookie2头设置一个值,如下所示:
res.setHeader('Set-Cookie2 ',甜饼干值.);/*基本服务器的核心模块会创建一个超文本传送协议服务器对象,附加基本服务器上用于检查请求,然后给予适当响应的功能基本服务器可以通过判断圣体头部匹配的容器对象响应来自多个域名的请求*/var http=require(' http ');var URL=必选(' URL ');出口。create server=function(){ var htserver=http。createserver(函数(req,RES){ req。basicserver={ urlpersed: URL。解析(请求。URL,真)};processHeaders(请求,资源);dispatchToContainer(htserver,req,RES);});htserver。basis server={ containers :[]};htserver.addContainer=函数(主机、路径、模块、选项){ if(查找容器)(htserver ),主机、路径)!=未定义){抛出新错误('已映射'主机'/'路径);} htserver。基本服务器。集装箱。push({ host : host,path: path,module: module,options 3360 options });归还这个;} htserver。usefavicon=function(host,path){ return this。addcontainer(host,'/favicon.ico ',require(')./FaviiconHandler '),{ icon path : path });} htserver。docroot=函数(主机、路径、根路径){返回这个。addcontainer(主机,路径,必需' ./staticHandler '),{ docroot : rootPath });}返回htserver } var lookuptainer=function(htserver,主机,路径){ for(var I=0;我是htserver。基本服务器。集装箱。长度;I){ var container=htserver。基本服务器。容器[I];var hostMatches=host。tolowercase().匹配(容器。主持人);var路径匹配=路径。匹配(容器。路径);if (hostMatches!==空路径匹配!==null){ 0返回{容器:容器,host: hostMatches,path : path matches };} }返回未定义;}//用于搜索请求标题数组以查找甜饼干和宿主头部,因为这两个字段对请求的分派都很重要//这个函数在每一个超文本传送协议请求到达时都会被调用//还有很多其他的超文本传送协议头部字段(Accept Accept-Encoding Accept-Language User-Agent)var processHeaders=function(req,RES){ req。基本服务器。cookies=[];变量键=对象键(请求头);for(var I=0;长度;I){ var hname=keys[I];var hval=req。headers[hname];if(hname。tolowercase()==' host '){ req。基本服务器。host=hval} //提取浏览器发送的cookie if(hname。tolowercase()==' cookie '){ req。基本服务器。饼干。push(hval);} }}//查找匹配的容器,分派请求到对应的容器中//这个函数在每一个超文本传送协议请求到达时都会被调用var dispatchToContainer=function(htserver,req,RES){ var container=lookup container(htserver,req.basicServer.host,req。基本服务器。已解析URL。路径名);如果(容器!==未定义){ req。基本服务器。hostmatches=容器。主持人;请求。基本服务器。路径匹配=容器。路径;请求。基本服务器。容器=容器。集装箱;集装箱。集装箱。模块。句柄(请求,资源);}else { res.writeHead(404,{ ' Content-Type ' : ' text/plain ' });请求结束。基本服务器。主机/请求。基本服务器。“已解析的网址”找不到处理程序);}}staticHandler.js
//用于处理文件系统内的文件,docroot选项指被存放文件所在文件夹的路径,读取该目录下的指定文件var fs=require(' fs ');var mime=require(' mime ');var sys=require(' sys ');exports.handle=function(req,res){ if (req.method!=='GET'){ res.writeHead(404,{ ' Content-Type ' : ' text/plain ' });res.end('无效方法请求。方法);} else { var fname=req。基本服务器。集装箱。选项。docroot请求。基本服务器。已解析URL。路径名;if(fname。match(/\/$/))fname=' index。html ';//如果统一资源定位器以/结尾fs.stat(fname,function(err,stats){ if(err){ RES . write head(500,{ ' Content-Type ' : ' text/plain ' });res.end('找不到文件fname ' err);} else { fs.readFile(fname,function(err,buf){ if (err){ res.writeHead(500,{ ' Content-Type ' : ' text/plain ' });res.end('文件' fname '不可读err);} else { res.writeHead(200,{ ' Content-Type ' : mime。查找(fname),“内容长度”: buf。length });结束(buf);} });} });}}faviconHandler.js
//这个处理函数处理对favicon.ico的请求//MIME模块根据给出的图标文件确定正确的哑剧类型,网站图标收藏夹图标可以是任何类型的图片,但是我们必须要告诉浏览器是哪个类型//MIME模块,用于生成正确的内容类型头var fs=require(' fs ');var mime=require(' mime ');exports.handle=function(req,res){ if (req.method!=='GET'){ res.writeHead(404,{ ' Content-Type ' : ' text/plain ' });res.end('无效方法请求。方法);} else if(req。基本服务器。集装箱。选项。图标路径!==未定义){ fs。readfile(请求。基本服务器。集装箱。选项。图标路径,函数(err,buf){ if (err){ res.writeHead(500,{ ' Content-Type ' : ' text/plain ' });决议结束(请求。基本服务器。集装箱。选项。“图标路径”未找到');} else { res.writeHead(200,{ ' Content-Type ' : mime。查找(请求。基本服务器。集装箱。选项。图标路径),“内容长度”: buf。length });结束(buf);} });} else { res.writeHead(404,{ ' Content-Type ' : ' text/plain ' });RES . end('无收藏夹图标');} }重定向器。射流研究…
/* 把一个域的请求重定向到另一个上,例如将www.example.com重定向到example.com上,或者使用简短的统一资源定位器跳转到较长的统一资源定位器实现这两种情况,我们需要在超文本传送协议响应中发送301(永久移除)或者302(临时移除)状态码,并且指定位置头信息。有了这个组合信号,web浏览器就知道要跳转到另一个网位置了*///地址http://localhost:3000/l/ex1会跳转到http://例1。com var util=require(' util ');var代码2 URL={ ' ex1 ' : ' http://示例1。' com ',' ex2 ' : ' http://示例2。com ' };var notFound=function(req,res){ res.writeHead(404,{ ' Content-Type ' : ' text/plain ' });请求结束。基本服务器。主机“/”请求。基本服务器。已解析URL。路径名找不到匹配的重定向代码);}exports.handle=function(req,RES){ if(req。基本服务器。路径匹配[1]){ var code=req。基本服务器。路径与[1]匹配;if(code 2 URL[code]){ var URL=code 2 URL[code];res.writeHead(302,{ ' Location ' : URL });RES . end();} else { notFound(req,RES);} } else { notFound(req,RES);}}docroot目录下:有favicon.png
index.html
html头/头体h1 INDEX/h1 pt这是一个索引html ./p/body/html
希望本文所述对大家nodejs程序设计有所帮助。
版权声明:从头开始学习Node.js系列教程中设置HTTP头的示例是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。