建设工作站服务器
使用Nodejs构建Web服务器是学习Node.js的相对全面的入门教程。 实现Web服务器需要Nodejs的几个重要模块,包括http协议模块、文件系统、url分析模块、路径分析模块和301重定向技术,因此构建简单的Web服务器
作为Web服务器,需要以下功能。
1、可以显示以. html/.htm结尾的网页
2、可以直接打开以. js/.css/.json/.text结尾的文件内容
3、显示图像资源
4、自动下载以. apk/.docx/.zip结尾的文件
5、在形式为http://xxx.com/a/b/的情况下,寻找在b目录之下是否有index.html,如果有的话则显示,列出该目录下的所有文件和文件夹,可以进一步访问
6、在格式为http://xxx.com/a/b的情况下,作为301重定向到http://xxx.com/a/b/可以解决内部资源的参照偏差问题。
部署所需的几个模块:
1
2
3
4
5
6
7
8
//http协议模块
varhttp=require(\\&; quot; http ( ( ) );
//url分析模块
varURL=require((\&; #039; URL ( ( ) );
//文件系统模块
varfs=require(fs;
//路径分析模块
varpath=require(path );
创建服务并在指定端口上接收:
1
2
3
4
5
6
7
8
//创建服务
var http server=http.createserver ( this.proce * * equest.bind ) this );
//在指定端口侦听服务
HTPserver.listen(port,function ) {
console.log ( [ http server ] [ start ],runing at http://ip : port /)
console.time end ( [ http server ] [ start ];
);
创建服务时,必须传递处理请求的匿名函数proce***equest。 proce***equest接收用于设置响应标头和响应客户端操作的两个参数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
proce***equest:function(request,response ) {
varhasExt=true;
varrequestUrl=request.url;
var pathname=URL.parse ( request URL ).pathname;
//解码请求的路径,防止中文乱码
pathname=decodeuri(pathname );
//如果路径没有扩展名
path.extname ( pathname )==((\\&; quot; () ) )
如果没有以//结尾,请添加//进行301重定向
if ( pathname.charat ( pathname.length-1 )!=//( ) )。
pathName=/;
var redirect=http://request.headers.host pathname;
response.writehead(301,{
位置:重定向
);
response.end (;
}
//添加默认访问页面,但此页面不一定存在,稍后会进行处理
pathName=index.html;
hasExt=false; //标记默认页面是由程序自动添加的
}
//获取资源文件的相对路径
var file path=path.join ( http/webroot,pathName );
//获取相应文件的文档类型
var content type=this.get content type (文件路径;
//文件名存在时
fs.exists (文件路径,函数) exists )。
if(Exists ) {
response.writehead(200,{content-type:contentType} );
var stream=fs.createreadstream ( file path,{flags:r,encoding:null} );
stream.on(error,function ) {
response.writehead(500,{content-type:text/html} );
response.end ( h 2500 server error/H2;
);
//返回文件的内容
stream.pipe(response;
}else{//文件名不存在时
if(hasext ) {
//如果该文件不是程序自动添加的,则直接返回404
response.writehead(404,{content-type:text/html} );
response.end(h2404notfound/H2 );
}else{
//如果文件由程序自动添加,并且不存在,则用户希望访问该目录下的文件列表
varhtml=headmetacharset=\\\&; quot; utf-8\\\&; quot; /head;
try{
//用户访问目录
var filedir=file path.substring ( 0,file path.lastindexof (\\\\\\ & amp ); quot;
//获取用户访问路径下的文件列表
var files=fs.readdir sync ( filedir );
//由于位于访问路径下,因此逐一列举文件,并添加超链接以供用户进一步访问
for(variinfiles ) {
varfilename=files[i];
HTML=divahref=\&; quot; filename\&; quot; \&; quot; filename\&; quot; filename/a/div;
}
}catch(e ) {
html=h2访问的目录不存在/h2
}
response.writehead(200,{content-type:text/html} );
response.end(html;
}
}
);
}
请求处理函数有几个关键点。
如果路径中有中文,浏览器会自动编码。 因此,在收到地址后,必须对地址进行解码。 否则,最后获得的路径和实际路径不一致。
如果访问路径不是以特定文件结尾,也不是以/结尾,则必须通过重定向将当前目录指向/。 否则,将找不到当前路径下的静态资源
如果访问路径是一个目录,则可以列出该目录下的所有文件和文件夹,然后单击即可进行访问。 必须在header中设置charset=utf-8才能正常显示中文目录
核心代码只有这么多,大约140行左右,完整的代码上传到github:https://github.com/gitonepixel/node。
要运行demo,请打开cmd并切换到根目录,然后运行node start。
详情请访问云服务器、域名注册、虚拟主机的问题,请访问西部数码代理商官方网站: www.chenqinet.cn