很多朋友对于node静态服务器和nodejs当web服务器行不行不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!

一、NodeJS什么都能做,为什么还要J*A

只要不涉及大量计算,理论上J*A能做的Node.JS几乎都能做,但“理论上能”和“能”是两回事。就如同能搬起一块砖,理论上就能盖一座楼。。但实际操作起来,就完全不是这么回事了。

盖楼的过程,会遇到各种各样的问题,每种问题,都要有不只一种的解决方案,而不是遇到什么问题,都仅靠一个非阻塞的异步IO就可以解决的。该如何实现跨线程访问?什么样的情况可能会产生内存泄露?用什么手段可以解决这些问题?答案不是凭空就出现的,对于一个新平台,要经过反复的试验,踩过数不清的坑,再填平这些数不清的坑,才可以真正的盖出一座大楼。。。。有些问题被封装起来了,你似乎不需要懂它的原理,只要调用一个函数就可以做一些事,被封装的问题,可以假装没看到,它并不是不存在。盖到第三层,你可以不考虑它。。。盖到第五层,也许楼就塌了。

Node.JS或许终有一天,可以做到J*A能做到的一切。。。。但那可能是十年以后的事情,而不是今天。目前唯一有潜力挑战J*A的是.Net Core,因为它已经证明了自己可以像J*A一样,独自盖起一座大楼。。。Python也已经长大了,但受动态语法限制,它的楼是盖不高的。。。至于NODE嘛,可以通过使用TS,避开动态语言的劣根*。但归根结底,想挑战J*a还太嫩了,今天只是个刚能勉强搬起一块板砖的儿童。

二、如何用nodejs搭建web服务器

使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:模块、文件系统、url解析模块、路径解析模块、以及301重定向技术等,下面我们就一起来学习如何搭建一个简单的Web服务器。

作为一个Web服务器应具备以下几个功能:

1、能显示以.html/.htm结尾的Web页面

2、能打开以.js/.css/.json/.text结尾的文件内容

3、显示图片资源

4、自动以.apk/.docx/.zip结尾的文件

5、形如,则查找b目录下是否有index.html,如果有就显示,如果没有就列出该目录下的所有文件及文件夹,并可以进一步访问。

6、形如,则作301重定向到,这样可以解决内部资源引用错位的问题。

引入需要用到的几个模块:

//协议模块var= require('');//url解析模块varurl= require('url');//文件系统模块varfs= require("fs");//路径解析模块varpath= require("path");

node静态服务器 nodejs当web服务器行不行

创建服务并在指定的端口监听:

//创建一个服务varServer= .createServer(this.processRequest.bind(this));//在指定的端口监听服务Server.listen(port,function(){console.log("[HttpServer][Start]","runing at );console.timeEnd("[HttpServer][Start]");});

在创建服务的时候需要传递一个匿名函数processRequest对请求进行处理,processRequest接收2个参数,分别是request和response, request对象中包含了请求的所有内容,response是用来设置响应头以及对客户端做出响应操作。

processRequest:function(request,response){varhasExt=true;varrequestUrl= request.url;varpathName= url.parse(requestUrl).pathname;//对请求的路径进行解码,防止中文乱码pathName= decodeURI(pathName);//如果路径中没有扩展名if(path.extname(pathName)===''){//如果不是以/结尾的,加/并作301重定向if(pathName.charAt(pathName.length-1)!="/"){pathName+="/";varredirect="://"+request.headers.host+ pathName;response.writeHead(301,{location:redirect});response.end();return;}//添加默认的访问页面,但这个页面不一定存在,后面会处理pathName+="index.html";hasExt=false;//标记默认页面是程序自动添加的}//获取资源文件的相对路径varfilePath= path.join("/webroot",pathName);//获取对应文件的文档类型varcontentType=this.getContentType(filePath);//如果文件名存在fs.exists(filePath,function(exists){if(exists){response.writeHead(200,{"content-type":contentType});varstream= fs.createReadStream(filePath,{flags:"r",encoding:null});stream.on("error", function(){response.writeHead(500,{"content-type":"text/html"});response.end("<h1>500 Server Error</h1>");});//返回文件内容stream.pipe(response);}else{//文件名不存在的情况if(hasExt){//如果这个文件不是程序自动添加的,返回404response.writeHead(404,{"content-type":"text/html"});response.end("<h1>404 Not Found</h1>");}else{//如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表varhtml="<head><meta charset='utf-8'></head>";try{//用户访问目录varfiledir= filePath.substring(0,filePath.lastIndexOf('\\'));//获取用户访问路径下的文件列表varfiles= fs.readdirSync(filedir);//将访问路径下的所以文件一一列举出来,并添加超,以便用户进一步访问for(variinfiles){varfilename= files[i];html+="<div><a href='"+filename+"'>"+filename+"</a></div>";}}catch(e){html+="<h1>您访问的目录不存在</h1>"}response.writeHead(200,{"content-type":"text/html"});response.end(html);}}});}

请求处理函数中有几个重点需要说一下:

对于路径中有中文的,浏览器会自动进行编码(英文不变,中文会变),因此在接收到后,需要对进行解码,否则最后得到的路径和真实路径不相符,

当访问路径不是以具体的文件结尾,并且不是以/结尾,则需要通过重定向加上/,表示当前目录,否则当前路径下的静态资源会找不到

如果访问路径是目录,则列出该目录下所有文件及文件夹,并可以访问,为了让中文目录能正常显示,则还要在header中设置charset=utf-8

核心代码就这么多,大概140行左右,完整的代码已上传到github:,

如果要运行demo,打开cmd切换到根目录,运行node start即可。

三、nodejs当web服务器行不行

可以呀

使用Node.js搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:模块、文件系统、url解析模块、路径解析模块、以及301重定向技术等,下面我们就一起来学习如何搭建一个简单的Web服务器。

作为一个Web服务器应具备以下几个功能:

1、能显示以.html/.htm结尾的Web页面

2、能打开以.js/.css/.json/.text结尾的文件内容

3、显示图片资源

4、自动以.apk/.docx/.zip结尾的文件

5、形如,则查找b目录下是否有index.html,如果有就显示,如果没有就列出该目录下的所有文件及文件夹,并可以进一步访问。

6、形如,则作301重定向到,这样可以解决内部资源引用错位的问题。

引入需要用到的几个模块:

//协议模块var= require('');//url解析模块varurl= require('url');//文件系统模块varfs= require("fs");//路径解析模块varpath= require("path");

创建服务并在指定的端口监听:

//创建一个服务varServer= .createServer(this.processRequest.bind(this));//在指定的端口监听服务Server.listen(port,function(){console.log("[HttpServer][Start]","runing at );console.timeEnd("[HttpServer][Start]");});

在创建服务的时候需要传递一个匿名函数processRequest对请求进行处理,processRequest接收2个参数,分别是request和response, request对象中包含了请求的所有内容,response是用来设置响应头以及对客户端做出响应操作。

processRequest:function(request,response){varhasExt=true;varrequestUrl= request.url;varpathName= url.parse(requestUrl).pathname;//对请求的路径进行解码,防止中文乱码pathName= decodeURI(pathName);//如果路径中没有扩展名if(path.extname(pathName)===''){//如果不是以/结尾的,加/并作301重定向if(pathName.charAt(pathName.length-1)!="/"){pathName+="/";varredirect="://"+request.headers.host+ pathName;response.writeHead(301,{location:redirect});response.end();return;}//添加默认的访问页面,但这个页面不一定存在,后面会处理pathName+="index.html";hasExt=false;//标记默认页面是程序自动添加的}//获取资源文件的相对路径varfilePath= path.join("/webroot",pathName);//获取对应文件的文档类型varcontentType=this.getContentType(filePath);//如果文件名存在fs.exists(filePath,function(exists){if(exists){response.writeHead(200,{"content-type":contentType});varstream= fs.createReadStream(filePath,{flags:"r",encoding:null});stream.on("error", function(){response.writeHead(500,{"content-type":"text/html"});response.end("<h1>500 Server Error</h1>");});//返回文件内容stream.pipe(response);}else{//文件名不存在的情况if(hasExt){//如果这个文件不是程序自动添加的,返回404response.writeHead(404,{"content-type":"text/html"});response.end("<h1>404 Not Found</h1>");}else{//如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表varhtml="<head><meta charset='utf-8'></head>";try{//用户访问目录varfiledir= filePath.substring(0,filePath.lastIndexOf('\\'));//获取用户访问路径下的文件列表varfiles= fs.readdirSync(filedir);//将访问路径下的所以文件一一列举出来,并添加超,以便用户进一步访问for(variinfiles){varfilename= files[i];html+="<div><a href='"+filename+"'>"+filename+"</a></div>";}}catch(e){html+="<h1>您访问的目录不存在</h1>"}response.writeHead(200,{"content-type":"text/html"});response.end(html);}}});}

请求处理函数中有几个重点需要说一下:

对于路径中有中文的,浏览器会自动进行编码(英文不变,中文会变),因此在接收到后,需要对进行解码,否则最后得到的路径和真实路径不相符,

当访问路径不是以具体的文件结尾,并且不是以/结尾,则需要通过重定向加上/,表示当前目录,否则当前路径下的静态资源会找不到

如果访问路径是目录,则列出该目录下所有文件及文件夹,并可以访问,为了让中文目录能正常显示,则还要在header中设置charset=utf-8

核心代码就这么多,大概140行左右,完整的代码已上传到github:,

如果要运行demo,打开cmd切换到根目录,运行node start即可。