手机版

Node.js在实战中搭建一个简单的Web服务器

时间:2021-10-10 来源:互联网 编辑:宝哥软件园 浏览:

在前一章中,我们介绍了Node.js,一个用于互联网服务的JavaScript服务器平台。同时,搭建了Node.js的运行环境,并通过两个HelloWorld程序验证了Node.js的基本功能。在本章中,我们还通过实际练习使用Node.js设置了一个简单的Web服务器。

如果你熟悉上的Web开发。NET或者其他类似的平台,你可能会想,设置一个Web服务器有什么意义?在Visual Studio中创建一个网站项目,然后单击“运行”。确实如此,但是请不要忘记,价格是,例如,如果你使用。NET开发Web应用程序,您将使用完整的IIS作为您的Web服务器的基础,因此您只能在应用程序发布时使用IIS。但是,如果您使用独立服务器(使用系统构建。Web.Hosting),就要处理各种HttpListener和对应的线程,会比较麻烦。毕竟。NET并不专注于面向网络的。Node.js在这方面提供了一种方便且可定制的方式,在此基础上您可以构建一个复杂且完全面向应用的服务平台。1.构建一个简单的Web服务器涉及到Node.js: 1的一些基本知识点。请求模块在Node.js中,系统提供了很多有用的模块(当然你也可以用JavaScript编写自己的模块,我们会在后面的章节中详细讲解),比如http和url。封装模块的特定功能,并提供相应的方法或属性。要使用这些模块,您需要请求模块获取它们的操作对象。以使用系统的http模块为例,可以这样写:复制代码如下: var LibHttp=require(' http ');//请求http协议模块,以便将来的程序可以通过变量libHttp访问HTTP模块的功能。本章使用了以下系统模块:http:封装http协议的服务器和客户端实现;Url:封装URL的解析和处理;Fs:封装在文件系统上操作的功能;Path:封装了路径的解析函数。有了这些模块,我们可以在巨人的肩膀上构建自己的应用。2.为了更好地观察程序的运行,在出现异常时方便地检查错误,控制台可以放松变量控制台来使用控制台的功能。复制代码如下: console.log('这是一条日志信息');并在控制台上输出定时信息://start time console . timeend(' timer 1 ');//启动名为“定时器1”的定时器.//结束定时器并输出到控制台. timeend(' timer 1 ');//结束名为“定时器1”的定时器并输出。3.定义函数Node.js中定义函数的方法和普通JavaScript中定义函数的方法完全一样,但是我们推荐下面的写法,就是用一个变量来命名函数,这样把函数作为参数传递给其他函数就方便明了了:复制代码如下://定义一个名为showErr=function(msg){ var INF=}的函数。味精;console . log(INF msg);返回消息;} 4.创建一个网络服务器并监听访问请求。创建Web服务器最重要的是为Web请求提供响应功能。它有两个参数,第一个代表客户端请求的信息,另一个代表要返回给客户端的信息。响应函数应该解析请求信息,并根据请求组装返回的内容。复制代码如下: //Request模块var libHttp=require(' http ');//HTTP协议模块//Web服务器主函数,解析请求并返回Web内容var funwebsvr=function (req,RES) {res. writehead (200,{ ' content-type ' : ' text/html ' });RES . write(' html body ');RES . write(' h1 * * * node . js * * */h1 ');res.write('h2Hello!/H2’;RES . end('/body/html ');}//创建一个http服务器var web SVR=libhttp . create server(funwebsvr);//开始听WebSVR。监听端口8124(8124);5.解析网页请求对于简单的网页访问请求,重要信息包含在请求信息参数的url中。我们可以使用url解析模块解析url中的访问路径,使用path模块将访问路径组装成实际要访问的文件路径进行返回。

复制代码如下: var reqUrl=req.url//获取请求的url //将请求的路径console.log(reqUrl)输出到控制台;//使用url解析模块获取路径名var pathname=lib URL . parse(req URL)。url中的路径名;//如果路径没有扩展名pathName='/',请使用path模块获取路径名中的if(lib path . ext name(pathName)=' ');//指定访问目录} if(pathName . charat(pathName . length-1)='/'){//如果访问目录pathName=' index.html//指定为默认网页}//使用路径解析模块组装实际文件路径var filepath=libpath.join('。/webroot ',路径名);6.设置返回头因为这是一个Web请求,所以有必要在返回的内容中包含http返回头。这里的重点是根据要访问的文件路径的文件扩展名来设置http返回头的内容类型。复制代码如下: var contentType=//使用路径解析模块获取文件扩展名var ext=libpath . ext name(file path);switch(ext){ case '。html ' : ContentType=' text/html ';打破;凯斯。js ' : ContentType=' text/JavaScript ';打破;default: contentType=“应用程序/八位字节-流”;}//在返回头中写入内容类型res. writehead (200,{ ' content-type ' : content type });7.将访问的文件内容写入返回的对象。有了要访问的文件的实际路径和文件对应的内容类型,就可以使用fs文件系统模块读取文件流并将其返回给客户端。

复制代码如下: //判断文件是否存在libpath.exists(文件路径,函数(exists){ if(exists){//File exists//将内容类型Res. writehead (200,{ ' content-type ' : fungetcontenttype(文件路径)})写入返回头;//创建一个只读流以返回varstream=libfs . createreadstream(file path,{flags:' r ',编码: null });//指定如果流读取不正确,将返回404错误流。on ('error ',function(){ RES . write head(404);res.end('h1404读取错误/h1 ');});//连接文件流和http返回流的管道用于返回实际的Web内容流. pipe(RES);} else {//文件不存在//error Res. writehead (404,{ ' content-type ' : ' text/html ' })返回;res.end('h1404未找到/h1 ');} });二.测试和运行1。完整的源代码下面大约100行的JavaScript就是构建这么简单的web服务器的全部源代码:复制代码如下://。一个演示Web服务器/////请求模块var LibHttp=require(' http ');//HTTP协议模块var libURl=require(' URL ');//URL解析模块var libFs=require(' fs ');//文件系统模块var LibPath=require(' path ');//路径解析模块//根据路径获取返回的内容类型字符串,用于http返回头var functcontenttype=function(file path){ var content type=' ';//使用路径解析模块获取文件扩展名var ext=libpath . ext name(file path);switch(ext){ case '。html ' : ContentType=' text/html ';打破;凯斯。js ' : ContentType=' text/JavaScript ';打破;凯斯。CSS ' : ContentType=' text/CSS ';打破;凯斯。gif ' : ContentType=' image/gif ';打破;凯斯。jpg ' : ContentType=' image/JPEG ';打破;凯斯。png ' : ContentType=' image/png ';打破;凯斯。ico ' : ContentType=' image/icon ';打破;default: contentType=“应用程序/八位字节-流”;}返回contentType//返回内容类型字符串}//Web服务器的主函数解析请求,返回Web内容var funwebsvr=function (req,RES){ var req URL=req . URL;//获取请求的url //将请求的路径console.log(reqUrl)输出到控制台;//使用url解析模块获取路径名var pathname=lib URL . parse(req URL)。url中的路径名;If (libpath。ext name(pathName)=' '){//如果路径没有扩展名pathName='/';//指定访问目录} if(pathName . charat(pathName . length-1)='/'){//如果访问目录pathName=' index.html//指定为默认网页}//使用路径解析模块组装实际文件路径var filepath=libpath.join('。/webroot ',路径名);//判断libpath.exists (filepath,function(exists){ if(exists){//file exists//在返回头中写入内容类型res.writehead (200,{ ' content-type ' : fungetcontenttype(file path)});//创建一个只读流以返回varstream=libfs . createreadstream(file path,{flags:' r ',编码: null });//指定如果流读取不正确,将返回404错误流。on ('error ',function(){ RES . write head(404);res.end('h1404读取错误/h1 ');});//连接文件流和http返回流的管道用于返回实际的Web内容流. pipe(RES);} else {//文件不存在//error Res. writehead (404,{ ' content-type ' : ' text/html ' })返回;res.end('h1404未找到/h1 ');} });}//创建一个http服务器var web SVR=libhttp . create server(funwebsvr);//指定服务器错误事件响应websvr.on ('error ',函数(error){ console . log(error);//在控制台中输出错误消息});//开始监听WebSVR.listen (8124,function(){//输出服务启动控制台的信息.登录到控制台('[WebSVR][Start]Running AT http://127 . 0 . 0 . 1:8124/');//结束服务启动计时器并输出console . timeend('[websvr][start]');});

2、资源目录

由于我们想要构建一个Web服务器,我们需要创建一个WebRoot目录来存储实际的网页和图片资源。“WebRoot”的目录名用于组装上述源代码中的实际文件路径。

00-1010在命令行中输入:node.exe,我们的网络服务器就会运行。此时可以通过浏览器访问,运行效果如下:

00-1010使用Node.js,我们可以轻松构建相对独立的Web服务器,其事件驱动的特性避免了繁琐的线程保护,其基本模块降低了开发难度。本章建立的Web服务器只是一个简单的样例,没有过多考虑模块化、安全性等问题,但是可以掌握Node.js开发的一些基础知识。作者:汪峰www.otlive.cn。

版权声明:Node.js在实战中搭建一个简单的Web服务器是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。