使用Nodejs搭建Web服务器

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

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

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

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协议模块

var http = require(‘http‘);

//url解析模块

var url = require(‘url‘);

//文件系统模块

var fs = require("fs");

//路径解析模块

var path = require("path");

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


1

2

3

4

5

6

7

8


//创建一个服务

var httpServer = http.createServer(this.processRequest.bind(this));

//在指定的端口监听服务

httpServer.listen(port,function(){

    console.log("[HttpServer][Start]","runing at http://"+ip+":"+port+"/");

    console.timeEnd("[HttpServer][Start]");

});

  

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


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


processRequest:function(request,response){

    var hasExt = true;

    var requestUrl = request.url;

    var pathName = url.parse(requestUrl).pathname;

    //对请求的路径进行解码,防止中文乱码

    pathName = decodeURI(pathName);

    //如果路径中没有扩展名

    if(path.extname(pathName) === ‘‘){

        //如果不是以/结尾的,加/并作301重定向

        if (pathName.charAt(pathName.length-1) != "/"){

            pathName += "/";

            var redirect = "http://"+request.headers.host + pathName;

            response.writeHead(301, {

                location:redirect

            });

            response.end();

        }

        //添加默认的访问页面,但这个页面不一定存在,后面会处理

        pathName += "index.html";

        hasExt = false//标记默认页面是程序自动添加的

    }

    //获取资源文件的相对路径

    var filePath = path.join("http/webroot",pathName);

    //获取对应文件的文档类型

    var contentType = this.getContentType(filePath);

    //如果文件名存在

    fs.exists(filePath,function(exists){

        if(exists){

            response.writeHead(200, {"content-type":contentType});

            var stream = 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){

                //如果这个文件不是程序自动添加的,直接返回404

                response.writeHead(404, {"content-type""text/html"});

                response.end("<h1>404 Not Found</h1>");

            }else {

                //如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表

                var html = "<head><meta charset=‘utf-8‘></head>";

                try{

                    //用户访问目录

                    var filedir = filePath.substring(0,filePath.lastIndexOf(‘\\‘));

                    //获取用户访问路径下的文件列表

                    var files = fs.readdirSync(filedir);

                    //将访问路径下的所以文件一一列举出来,并添加超链接,以便用户进一步访问

                    for(var in files){

                        var filename = 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行左右,完整的代码已上传到gi th u b : ht t p s :/ / g i th u b . c om / g i t - on epixel/Node,

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

时间: 2024-10-03 23:02:16

使用Nodejs搭建Web服务器的相关文章

巨杉Tech | 使用 SequoiaDB + Docker + Nodejs 搭建 Web 服务器

容器化技术的出现大大简化了应用开发人员在构建底层基础设施的工作.SequoiaDB 巨杉数据库于3.2.1版本正式推出了 Docker 容器化部署方案,本文将会基于 SequoiaDB 巨杉数据库与Nodejs的 Docker 镜像搭建一个简易的 Web 服务器. 1.规划部署我们将会搭建一个三分区三副本的高可用 SequoiaDB 巨杉数据库.同时,我们将会创建一个 SequoiaDB 巨杉数据库的 MySQL 实例,用以提供 Nodejs 作为数据源. 容器角色 容器名/IP:端口 分区组

Nodejs搭建web服务器实现简单的登陆

本服务器采用了node-koa(2.0):koa是Express下的一个web框架. 搭建步骤: 1.首先我们创建一个web-koa目录,在目录下创建app.js,package.json,start.js三个文件. 2.然后我们来编辑最基本的package.json文件,如下: $ npm init { "name": "myapp", "version": "1.0.0", "description":

微信小程序开发入门(一),Nodejs搭建本地服务器

1.  如何模拟真实环境中,读取服务端数据,首先需要使用Nodejs搭建一个本地服务器的环境. 在搭建web服务器之前,需要先安装node.js(安装版本最好为6.9.x) 安装后node.js,接下来就需要安装http的镜像文件 npm install http-server -g(windows下)sudo npm install http-server -g(linux和mac下)接下来在桌面创建一个文件夹 cd 文件夹名字http-server这时候,就会显示在8080端口下运行的一个本

NodeMCU入门(4):搭建Web服务器,配置网络连接

准备工作 1.NodeMCU模块 2.ESPlorer v0.2.0-rc6 3.NodeMCU-HTTP-Server 搭建web服务器 下载https://github.com/wangzexi/NodeMCU-HTTP-Server文件,并上传到NodeMCU中 修改init.lua文件,可参看NodeMCU-HTTP-Server Example -- init.lua --------------------- -- wifi --------------------- print('

搭建web服务器环境

搭建web服务器的环境(配置PHP的工作环境): 首先要配置php,在Apache的配置文件夹中httpd.conf中配置 1把php配置成Apache的一个功能模块 LoadModule php5_module "F:\class22\amp\php\php5apache2_2.dll" 2.指定.php 后缀的文件交给PHP的功能模块处理 AddType apalication/x-httpd-php .php 3.确定PHP的配置文件php.ini的路径 PHPIniDir &q

linux搭建web服务器

linux httpd 假设服务器地址为192.168.80.20/24 1.   将准备安装的httpd软件包共享给everyone , (1)在linux上mount.cifs  //真机IP地址/共享文件夹名   /media / ls  /meidia/ 查看 tar    xjvf   httpd-2.4.10.tar.bz2    -C  /usr/src       解压至/usr/src下 下面两个插件是httpd2.4以后的版本所需要的 http://ftp.jaist.ac.

如何搭建web服务器 使用Nginx搭建反向代理服务器

转载   如何搭建web服务器 使用Nginx搭建反向代理服务器 :   http://blog.csdn.net/w13770269691/article/details/6977727 引言:最近公司有台服务器遭受DDOS攻击,流量在70M以上,由于服务器硬件配置较高所以不需要DDOS硬件防火 墙.但我们要知道,IDC机房是肯定不允许这种流量一直处于这么高的,因为没法具体知道后面陆续攻击的流量会有多大,如果流量过大就会导致整个IDC网络 瘫痪.我们都知道北方的数据中心和南方的数据中心从带宽出

Ubuntu 用 apache2 搭建 web 服务器 建wordpress博客

主要有5个步骤分别是: 1: 安装mysql. 2: 安装apache2 3: 安装php5 及其组件 4: 安装wordpress 第1步:安装mysql  这步非常简单.... sudo apt-get install mysql-server 输入用户名和密码..... 测试一下....就完成了 第2步: 安装apache2 sudo apt-get install apache2 安装完成 在浏览器里输入127.0.0.1就可以看到apache2的测试页 **apache2安装好后,默认

在Win7系统中搭建Web服务器

局 域网Web服务器的主要功能是实现资源共享,同时借助于局域网服务器访问页面可有效的实现信息的同步.利用Web服务器,我们随时随地都可以将自己的信息 上传到服务器端,让其它关注你的用户能在第一时间内了解的思想和动态.下面笔者就如何在Windows7系统下搭建Web服务器与大家交流一下. 工具/原料 Windows7操作系统 方法/步骤 1 打开控制面板,选择并进入“程序”,双击“打开或关闭Windows服务”,在弹出的窗口中选择“Internet信息服务”下面所有地选项,点击确定后,开始更新服务