Node.js搭建WEB服务器的示例代码

前言

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

简单例子

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

建立项目及运行

project

rush:plain;"> web-server + | - server.js

server.js

rush: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.IncomingMessage 和 http.ServerResponse 。在回调函数体里,利用 http.ServerResponse 的方法设置了响应头和响应主体,最后以 end() 方法结束本次请求。

路由功能

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

实现简单路由

project

rush:plain;"> web-server | - server.js + | - router.js

server.js

rush:js;"> const http = require('http'); const router = require('./router.js');

function handleHello(request,{
"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

rush:js;"> const url = require('url');

exports.register = function(request,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(`

NOT FOUND

404 NOT FOUND

`); }

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

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

静态资源请求

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

route.js

rush: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);
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服务器基本的功能,它还有很大的改进空间。我将项目开源到 上,有兴趣的可以克隆下来。希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...