Node.js搭建WEB服务器

前言

这几天为了熟悉vue.js框架,还有webpack的使用,就准备搭建一个发布和浏览markdwon的简单WEB应用。原本是想着用bash脚本和busybox的httpd来作为后台服务,但是bash脚本解析和生成JSON非常不方便,而用Java语言写又觉得部署不方便,所以就想到了正在用到的Node.js,于是就有了这篇博文。(文末有本文代码的github地址)

简单例子

首先,从搭建最简单的Hello world开始,建立以下目录、文件和内容。

建立项目及运行

project

  web-server
+ | - server.js

server.js

const http = require(‘http‘);

http.createServer(function(request, response) {
  // 设置响应头
  response.writeHeader(200, {
    "Content-Type" : "text/plain"
  });
  // 响应主体为 "Hello world!"
  response.write("Hello world!");
  response.end();
})
// 设置监听端口为9000
.listen(9000);

现在,在项目目录运行下面命令来执行server.js,浏览器地址栏中输入localhost:9000,如果一切访问都正常,浏览器就会显示Hello world!

node server.js

提示:使用ctrl+c停止脚本运行。

至此一个简单例子就运行成功了,下面来分析一下代码。

代码分析

首先,server.js中引入了Node.js的http模块,它提供了非常底层HTTP API支持。这里使用createServer()方法,它返回一个http.server实例,使用该实例的listen()方法来设置监听端口。

方法createSever()中填写的参数是一个函数,该函数会作为回调函数自动添加到request事件去,其参数类型分别为http.IncomingMessagehttp.ServerResponse。在回调函数体里,利用http.ServerResponse的方法设置了响应头和响应主体,最后以end()方法结束本次请求。

路由功能

上述的例子仅仅实现了简单请求响应功能,现在增加路由的功能来健壮我们的WEB服务器。现在,修改为以下的目录、文件和内容。

实现简单路由

project

  web-server
  | - server.js
+ | - router.js

server.js

const http = require(‘http‘);
const router = require(‘./router.js‘);

function handleHello(request, response) {
  // 设置响应头
  response.writeHeader(200, {
    "Content-Type" : "text/plain"
  });
  // 响应主体为 "Hello world!"
  response.write("Hello world!");
  response.end();
}

http.createServer(function(request, response) {
  // 注册路径和其对应回调函数
  router.register(request, response, [
    {
      ‘url‘: ‘/hello‘,
      ‘handler‘: handleHello
    }
  ]);
})
// 设置监听端口为9000
.listen(9000);

router.js

const url = require(‘url‘);

exports.register = function(request, response, mapping) {
  // 解析请求路径
  var pathName = url.parse(request.url).pathname;
  // 执行相应请求路径的回调函数
  for(let i = 0, len = mapping.length;i < len;i++) {
    if(mapping[i].url === pathName) {
      mapping[i].handler(request, response);
      return;
    }
  }
  // 请求路径不存在返回404页面
  response.writeHeader(404, {
    "Content-Type" : "text/html"
  });
  response.end(`
    <html>
      <head>
        <title>NOT FOUND</title>
      </head>
      <body>
        <h1>404 NOT FOUND</h1>
      </body>
    </html>
  `);
}

现在,再次执行server.js脚本,接着浏览器访问localhost:9000\hello会得到Hello world!的结果,而访问其他路径则会得到404页面。

这个功能的核心实现是在router.js中,通过请求路径的解析,然后根据预先注册好的mapping数组,找到与之对应的路径并执行相应的回调函数。

静态资源请求

当前的路由功能只能实现回调函数的执行,而一个WEB服务器应具有响应静态资源请求的能力,接下我们继续来改造它。现在,保持server.js内容不变,只改变router.js中的内容(部分代码内容省略)。

route.js

const url = require(‘url‘);
const path = require(‘path‘);
const fs = require(‘fs‘);

function getErrorInfo(errorType) {
  // 省略代码
}

function writeErrorPage(response, errorType) {
  // 省略代码
}

exports.register = function(request, response, mapping) {
  // 解析请求路径
  var pathName = url.parse(request.url).pathname;
  // 执行相应请求路径的回调函数
  for(let i = 0, len = mapping.length;i < len;i++) {
    if(mapping[i].url === pathName) {
      mapping[i].handler(request, response);
      return;
    }
  }
  // 请求路径为文件返回文件内容
  var file = path.resolve(__dirname, ‘.‘ + pathName);
  fs.exists(file, function(exists) {
    // 请求路径不存在返回404页面
    if(!exists) {
      writeErrorPage(response, ‘NOT_FOUND‘);
    }
    else {
      var stat = fs.statSync(file);
      // 请求路径为目录返回403页面
      if(stat.isDirectory()) {
        writeErrorPage(response, ‘FORBIDDEN‘);
      }
      else {
        response.writeHeader(200, {
          "Content-Type" : "text/html"
        });
        response.end(
          fs.readFileSync(file, ‘utf-8‘)
        );
      }
    }
  });
}

将静态资源请求的行为置后的设计,是为了保证回调函数一定能执行。当静态资源不存在时,应当返回不存在的错误,同时也设置了禁止目录的访问的规则。

后话

现在,只是实现了WEB服务器基本的功能,它还有很大的改进空间。我将项目开源到github上,有兴趣的可以克隆下来。

原文地址:https://www.cnblogs.com/linzhehuang/p/9476771.html

时间: 2024-08-02 00:23:35

Node.js搭建WEB服务器的相关文章

学习 node.js 搭建web服务器

开始 学习使用 node.js 首先完成搭建一个 web服务器.myweb.js 1 var http = require('http'); 2 var url = require('url'); 3 var hostname = '127.0.0.1'; 4 var port = 3000; 5 var bodystr = ""; 6 var server = http.createServer(function(req, res){ 7 res.statusCode = 200;

Node.js 的Web 服务器--Fenix

Fenix 是提供给开发人员使用的简单的一个 Web 服务器, 是基于 Node.js 开发.可以同时在上面运行很多的项目, 最适合前端开发人员使用. 可以通过免费的 Node.js 控制台创建,停止,启动和共享 Fexix 服务器. 您可以通过把你的桌面变成一个公共的 Web 服务器,让大家能看到你的web服务. Fenix官方 Node.js 的Web 服务器--Fenix

node.js搭建简单服务器,用于前端测试websocket链接方法和性能测试

WebSocket简介 谈到Web实时推送,就不得不说WebSocket.在WebSocket出现之前,很多网站为了实现实时推送技术,通常采用的方案是轮询 (Polling)和Comet技术,Comet又可细分为两种实现方式,一种是长轮询机制,一种称为流技术,这两种方式实际上是对轮询技术的改进,这些 方案带来很明显的缺点,需要由浏览器对服务器发出HTTP request,大量消耗服务器带宽和资源.面对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并实现真正意义上的

Node.js作web服务器总结

1.为什么Node.js用JS开发 首先,我们都清楚的是,同时接收数量众多的请求是服务器非常常见的情况.而web应用程序架构(包括流量.处理器速度和内存速度)中的瓶颈在于:服务器能够处理的并发连接的最大数量.解决这个瓶颈,有三种方法: ①系统线程模型:服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了. ②多线程.线程池模型:调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待.它有个更严重的问题,

基于Node.js搭建静态服务器

作者:zhanhailiang 日期:2014-11-23 原理: 通过解析请求url来解析到相应文件路径: 判断文件是否存在: 若存在,则读取文件内容输出: 实现: var path = require('path'), fs = require('fs');   require('http').createServer(function(req, res) { // 解析文件路径,默认以当前目录为根目录查找文件 // 这里可以通过配置root值来做为相对根目录查找文件 var file =

node.js搭建HTTP服务器

新建server.js var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, { "Content-Type": "text/plain" }); response.write("Hello World"); response.end(); }).listen(8888); node

Node.js 搭建HTTP服务器,提供文件下载

直接上代码,这是第一版,可以判断扩展名 var http = require('http'); var express = require('express'); var fs=require("fs"); var path=require("path"); var mime = require('mime'); var app = express(); var currDir = 'F:\\Users\\djyk\\74dj.mp3'; app.get('*',

20秒搭建web服务器,跨平台(mac,window)

服务器: http-server 问题: 其实搭建web服务器有很多种方法,比如: 1.本地的 apache, nginx 2.自己下载安装一个软件,如phpServer 3.node.js 静态web服务器 (页面加载图片时不方便) 4.http-server(推荐) 5.发布到远程服务器 解答: 推荐http-server的原因: 1.零配置 2.安装方便,只需要输入一句命令即可全局安装:    npm install http-server -g 3.使用简单,只要输入一条命令即可: ht

利用node.js搭建简单web服务器的方法教程

前言 使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块.路径解析模块.以及301重定向问题,下面我们就简单讲一下如何来搭建一个简单的Web服务器. 早先不使用web服务器的情况下想要在浏览器端访问本地资源,可以利用firefox浏览器,其可以自己启动一个小型web服务器. 为了让刚接触node的人也能大体看懂,本文的代码我将尽量简化. 准备 首先,