陈奇网络工作室

使用Nodejs构建Web服务器

建设工作站服务器

使用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

相关推荐

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3