使用Node.js搭建Web服务器

 更新时间:2022年06月24日 11:46:36   作者:小旭2021  
这篇文章介绍了使用Node.js搭建Web服务器的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

1、 Node.js 创建的第一个应用

1、引入http模块

var http = require("http");

2、 创建服务器

接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。函数通过 request, response 参数来接收和响应数据。

//1.引入 http 模块
var http=require('http');
//2.用 http 模块创建服务
http.createServer(function(req,res){
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
//设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf-8
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
res.write('你好 nodejs');
res.write('我是第一个 nodejs 程序');
res.end(); /*结束响应*/
}).listen(8001);

2、 WEB 服务器介绍

Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档, 也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个 Web 服务器是 Apache 、 Nginx 、IIS。

3、 Nodejs 封装一个 WEB 服务器

启动

node start

功能

* 能显示以 `.html/.htm` 结尾的 Web 页面

* 能直接打开以 `.js/.css/.json/.text` 结尾的文件内容

* 显示图片资源

* 自动下载以 `.apk/.docx/.zip` 结尾的文件

* 形如 `http://xxx.com/a/b/` , 则查找b目录下是否有 `index.html`,如果有就显示,如果没有就列出该目录下的所有文件及文件夹,并可以进一步访问。

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

HttpServer.js

module.exports = (function () {
 
  "use strict";
 
  console.time('[HttpServer][Start]');
 
  //http协议模块
  var http = require('http');
  //url解析模块
  var url = require('url');
  //文件系统模块
  var fs = require("fs");
  //路径解析模块
  var path = require("path");
 
  return {
    //启动服务
    start: function () {
      var port = this.config.port;
      var ip = this.config.ip;
 
      //创建一个服务
      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]");
      });
 
      httpServer.on("error", function (error) {
        console.error(error);
      });
    },
 
    /**
     * 请求处理
     * @param request
     * @param response
     */
    processRequest: function (request, response) {
      var hasExt = true;
      var requestUrl = request.url;
      var pathName = url.parse(requestUrl).pathname;
 
      //对请求的路径进行解码,防止中文乱码
      pathName = decodeURI(pathName);
 
      //如果路径中没有扩展名
      if ((pathName) === '') {
        //如果不是以/结尾的,加/并作301重定向
        if (pathName.charAt(pathName.length - 1) != "/") {
          pathName += "/";
          var redirect = "http://" + request.headers.host + pathName;
          response.writeHead(301, {
            location: redirect
          });
          response.end();
          return; //fix bug: 执行301重定向后应终止后续流程,以防 "write after 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 i 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);
          }
        }
      });
    },
 
    /**
     * 获取文档的内容类型
     * @param filePath
     * @returns {*}
     */
    getContentType: function (filePath) {
      var contentType = this.config.mime;
      var ext = path.extname(filePath).substr(1);
      if (contentType.hasOwnProperty(ext)) {
        return contentType[ext];
      } else {
        return contentType.default;
      }
    },
 
    ///配置信息
    config: {
      port: 8888,
      ip: '127.0.0.1',
      mime: {
        html: "text/html",
        js: "text/javascript",
        css: "text/css",
        gif: "image/gif",
        jpg: "image/jpeg",
        png: "image/png",
        ico: "image/icon",
        txt: "text/plain",
        json: "application/json",
        default: "application/octet-stream"
      }
    }
  }
})();

start.js

var http = require('./http/HttpServer');
http.start();

源代码

点击下载

到此这篇关于使用Node.js搭建Web服务器的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Node.js入门教程:在windows和Linux上安装配置Node.js图文教程

    Node.js入门教程:在windows和Linux上安装配置Node.js图文教程

    这篇文章主要介绍了Node.js入门教程:在windows和Linux上安装配置Node.js的方法,本文图文并茂,步骤明细,是学习安装node.js的绝佳教程,需要的朋友可以参考下
    2014-08-08
  • nvm报错Now using node v版本号(64-bit)图文解决方法

    nvm报错Now using node v版本号(64-bit)图文解决方法

    这篇文章主要给大家介绍了关于nvm报错Now using node v版本号(64-bit)的解决方法,文中将解决的办法介绍的非常详细,对遇到这个问题的朋友具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • node.js中fs.stat与fs.fstat的区别详解

    node.js中fs.stat与fs.fstat的区别详解

    fs.stat和fs.fstat他们都是用来获取文件的状态信息,下面这篇文章主要给大家介绍了关于node.js中fs.stat与fs.fstat区别的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • node 利用进程通信实现Cluster共享内存

    node 利用进程通信实现Cluster共享内存

    本篇文章主要介绍了node 利用进程通信实现Cluster共享内存,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 详解Nodejs mongoose

    详解Nodejs mongoose

    Mongoose 是在nodejs环境下,对mongodb进行便捷操作的对象模型工具。本文介绍解(翻)密(译)Mongoose插件。这篇文章给大家详细介绍了Nodejs mongoose 的相关知识,感兴趣的朋友一起看看吧
    2018-06-06
  • Node.js Buffer模块功能及常用方法实例分析

    Node.js Buffer模块功能及常用方法实例分析

    这篇文章主要介绍了Node.js Buffer模块功能及常用方法,结合实例形式分析了Buffer模块的各种常用函数及相关使用技巧,需要的朋友可以参考下
    2019-01-01
  • Node.js中的require.resolve方法使用简介

    Node.js中的require.resolve方法使用简介

    在Node.js中,可以使用require.resolve函数来查询某个模块文件的带有完整绝对路径的文件名,下面这篇文章主要介绍了Node.js中require.resolve方法使用的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-04-04
  • 详解node.js搭建代理服务器请求数据

    详解node.js搭建代理服务器请求数据

    本篇文章主要介绍了详解node.js搭建代理服务器请求数据,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法

    nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法

    这篇文章主要介绍了nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Node.js应用设置安全的沙箱环境

    Node.js应用设置安全的沙箱环境

    这篇文章主要介绍了Node.js应用设置安全的沙箱环境的方法以及注意事项,对此有需要的朋友可以参考学习下。
    2018-04-04

最新评论