NodeJs开发简易的Http本地服务器

第一次接触本地服务器是很早之前因为Js学到Ajax部分,需要通过发送Http请求读取本地文件。

网上实用的本地服务器有很多,如Apache,XAMPP等。不过在我平时开发的过程中,其实用不了太多功能,多数情况下只需要我们的服务器根据请求从本地读取文件,不大必要使用上述的大型本地服务器,所以在我接触NodeJs后,索性用NodeJs写了一个Http本地服务器,连同空行总共69行代码。

运行效果图之一

(成功开启服务器后的效果如上图所示)

首先创建一个.js文件,文件名可以自定,这里我命名为fileServer.js。写入以下代码:

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
"use strict";
var path = require("path"),
url = require("url"),
fs = require("fs"),
http = require("http");
var rootPath = path.resolve(process.argv[2] || ".");
var port = Number(process.argv[3]) || 8080;
var server = http.createServer(function (request, response) {
var u = request.url,
pathName = url.parse(u).pathname;
console.log("\n >>> " + request.method + ": " + u + " <<< \n");
fileServer(pathName, response);
});
server.listen(port);
function fileServer(pathName, response) {
var filePath = path.join(rootPath, pathName);
readPath(filePath, response);
}
function readPath (filePath, response) {
fs.stat(filePath, function (err, stats) {
if (!err) {
if (stats.isDirectory()) {
filePath = filePath + "index.html";
readPath(filePath, response);
return;
} else if (!stats.isFile()) {
responseStatsChanged(false, filePath, response);
return;
}
responseStatsChanged(true, filePath, response);
fs.createReadStream(filePath).pipe(response);
return;
}
responseStatsChanged(false, filePath, response);
});
}
function responseStatsChanged (stat, u, response) {
if (!stat) {
console.log("\n >>> 404 " + u + " <<< \n");
response.writeHead(404);
response.end("<h1>404 Not Found</h1>");
} else {
console.log("\n >>> 200 " + u + " <<< \n");
response.writeHead(200);
}
}
console.log("\n >>> Server is running at http://127.0.0.1:" + port + "/ . <<< \n");

主要用了pathurlfshttp这几个模块。大致流程为:

  1. 获取命令行运行参数(一个目录地址,此后浏览器访问地址都是以此为根目录的,默认为fileServer.js所在目录)
  2. 利用http模块创建Http服务器
  3. 收到请求后,调用fileServer函数,通过path.join获取文件的绝对地址
  4. 调用readPath函数读取文件地址(如果地址所指是一个目录,那就读取目录下的index.html文件)
  5. 读取失败,response写入404;读取成功,response写入200,将读取的数据流入response

接下来,运行我们服务器(使用默认的fileServer.js所在目录为根目录):

1
$ node ./fileServer.js

如果得到了与文首截图相似的输出效果,那说明服务器已经开启成功了。之后我们要测试我们的服务器。在我们创建的fileServer.js所在目录下创建一个index.html。写入代码:

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<head>
<title>Hello world!</title>
</head>
<body>
<h1>Hello World!</h1>
<h2>Test local server successfully!</h2>
</body>
</html>

浏览器输入http://localhost:8080/index.html,然后进入网页,得到结果:

运行效果图之二

同时我们的终端也有输出:

运行效果图之三

可以看到,我们的本地服务器已经在正常地工作了。不过上面提供的代码很简陋,使用起来会有局限,例如:1, 直接输入目录名,如localhost:8080/dirname,将会得到404结果,必须输入localhost:8080/dirname/才能自动读取localhost:8080/dirname/index.html文件。2, 只提供404和200两种status,当然这个方面大家可以根据所需自行拓展~

最后,如果是使用linux或者OS X的同学,可以把运行fileServer.js的命令写到一个shell文件里,然后放到usr/local/bin/下,这样一来,在运行我们的服务器时就不需要输入很长的命令了。

版权声明:本文为博主原创文章,转载请注明出处 http://yuehaowang.github.io/2017/07/10/simple_http_local_server_with_nodejs/
分享到 评论