如何用nodejs搭建web服务器,第1张

您好 很高兴为您解答:

这个web服务器包括三块,appjs是程序入口,负责响应url请求;routejs是路由,用来分发处理复杂的业务逻辑;systemjs是配置文件,用来配置服务器参数,如host、port等

首先来看appjs,引用模块,http处理url请求,url用来解析请求参数和路径,path只是用来匹配路径的扩展名o(╯□╰)o,fs用来读取本地静态文件,剩下两个模块后面详解。

接下来正式创建服务器处理请求,请求大致分两类,一类是静态文件,如xxxhtml、xxxjs等等,另一类是进行业务处理,如常见的增删查改操作,这一部分操作交给路由处理,这里用了一个简单的判断逻辑:通过后缀名,后缀名在systemjs中配置。

读取本地文件的时候要注意一点,那就是缓存。如果客户端发出重复请求,服务器需要判断文件自上次请求后是否发生了修改,如果未修改返回304,这样可以加快浏览器端的响应速度。这里的判断方式是通过判断请求的header的if-modified-since时间和本地文件修改时间是否一致,如果一致则返回304,否则重置该时间,第一张图是代码,第二张图是通过chrome调试工具看到的请求头部时间。

如果需要进行业务处理,则交给路由处理了。首先路由引入具体的业务逻辑模块,然后通过解析具体的路径名来执行具体的业务逻辑,这里注意的是:由于nodejs的并发特性,记得传入回调函数来获得相应的处理结果。

望采纳 谢谢

使用Nodejs搭建Web服务器是学习Nodejs比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块、文件系统、url解析模块、路径解析模块、以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器。

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

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

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

3、显示资源

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

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

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

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

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

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

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

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

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

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

核心代码就这么多,大概140行左右,完整的代码已上传到Git:https://githubcom/git-onepixel/Node

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

参考cnodejsorg上面的静态服务器例子,写了下面的一个nodejs静态服务器例子,里面包含cache,压缩,贴代码如下

/

静态文件服务器测试例子

User: xuwm

Date: 13-5-17

Time: 上午8:38

To change this template use File | Settings | File Templates

/

var port=3333;

var http = require("http");

var url = require("url");

var fs = require("fs");

var path = require("path");

var mime = require("/mime")types;

var config = require("/config");

var zlib = require("zlib");

//创建http服务端

var server=httpcreateServer(function(request,response){

var obj= urlparse(requesturl);

responsesetHeader("Server","Node/V8");

consolelog(obj);

var pathname=objpathname;

if(pathnameslice(-1)==="/"){

pathname=pathname+configWelcomefile; //默认取当前默认下的indexhtml

}

var realPath = pathjoin("assets", pathnormalize(pathnamereplace(/\\/g, "")));

consolelog(realPath) ;

var pathHandle=function(realPath){

//用fsstat方法获取文件

fsstat(realPath,function(err,stats){

if(err){

responsewriteHead(404,"not found",{'Content-Type':'text/plain'});

responsewrite("the request "+realPath+" is not found");

responseend();

}else{

if(statsisDirectory()){

}else{

var ext = pathextname(realPath);

ext = ext extslice(1) : 'unknown';

var contentType = mime[ext] || "text/plain";

responsesetHeader("Content-Type", contentType);

var lastModified = statsmtimetoUTCString();

var ifModifiedSince = "If-Modified-Since"toLowerCase();

responsesetHeader("Last-Modified", lastModified);

if (extmatch(configExpiresfileMatch)) {

var expires = new Date();

expiressetTime(expiresgetTime() + configExpiresmaxAge 1000);

responsesetHeader("Expires", expirestoUTCString());

responsesetHeader("Cache-Control", "max-age=" + configExpiresmaxAge);

}

if (requestheaders[ifModifiedSince] && lastModified == requestheaders[ifModifiedSince]) {

consolelog("从浏览器cache里取")

responsewriteHead(304, "Not Modified");

responseend();

} else {

var raw = fscreateReadStream(realPath);

var acceptEncoding = requestheaders['accept-encoding'] || "";

var matched = extmatch(configCompressmatch);

if (matched && acceptEncodingmatch(/\bgzip\b/)) {

responsewriteHead(200, "Ok", {'Content-Encoding': 'gzip'});

rawpipe(zlibcreateGzip())pipe(response);

} else if (matched && acceptEncodingmatch(/\bdeflate\b/)) {

responsewriteHead(200, "Ok", {'Content-Encoding': 'deflate'});

rawpipe(zlibcreateDeflate())pipe(response);

} else {

responsewriteHead(200, "Ok");

rawpipe(response);

}

}

}

}

});

}

pathHandle(realPath);

});

serverlisten(port);

consolelog("http server run in port:"+port);

首先需要在JS文件里创建一个assets的文件夹,里面放入你要浏览的静态文件,比如,indexhtml,demojs等。

运行方式为:在命令行里切换到上面的JS的文件目录,然后输入 node JS文件名

nodejs其实是非常底层的,从功能上说,它既是apache也是php。像搭建http服务器这种功能,本来是apache已经封装好的,但nodejs需要我们手动来搭建。其实在实际应用中,我们可以使用现成的框架。但这里,我想手动搭建,也加深一下对http服务器的理解。

我们node执行下面这个文件,我命名为httpjs,它将创建一个httpServer并监听3000端口。

1Nodejs安装包及源码下载地址为:https://nodejsorg/en/download/

Git下载地址为:https://git-scmcom/download/win。

2按照安装提示操作即可,选择安装路径、npm。

3环境变量默认C:\Users\Administrator\AppData\Roaming\npm\node_modules。

创建新的变量

创建方法:我的电脑>属性》高级系统设置》环境变量》,创建名NODE_PATH,值为nodejs的当前安装目录。

命令行工具是运行在当前计算机用户下的,所以开头总是C:/Users/XXX/Desktop>,而不会跟你的nodejs安装的位置有关。

安装node后,在cmd里有两种模式,开发模式和命令行模式,要进入开发模式直接输入node回车即可,此时可以输入代码,比如require ("express"),如果直接在命令行模式下输入require类的语句是会报错的,提示'require'不是内部或外部命令,也不是可运行的程序或批处理文件。从开发模式退出可用exit命令也可以用快捷捷,ctrl+D或两次ctrl+C

4创建应用

我们先创建一个项目目录,目录可自己定义,本案例的目录为 e:/node/serve。

由于我们要搭建的是服务器,所以我把第一个文件命名为serverjs。

在serverjs里面输入以下代码:

const http = require('http');//实例化“http”

const hostname = '127001';

const port = 3000;

const server = httpcreateServer((req, res) => {

resstatusCode = 200; //状态值200:OK

ressetHeader('Content-Type', 'text/plain'); //内容类型:text/plain

resend('Hello World\n'); //响应结果“hello world”

});

serverlisten(port, hostname, () => {  //实现监听

consolelog(`Server running at http://${hostname}:${port}/`);

});

5应用执行

打开git命令行,输入cd e:/node/serve/

之后输入node servicejs

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何用nodejs搭建web服务器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情