manlili blog

Node搭建本地服务器

今天项目发布完了,下午闲着有点时间,研究下老大用node搭建的服务器代码。

了解目录结构

先来看下目录
图
假设我在server文件夹里面创建一个app.js用来搭本地服务器。

第一步

首先需要在app.js引进Node插件express和读文件的插件fs,代码如下:

1
2
3
var express = require('express');
var app = express();
var fs = require('fs');

第二步

再在在app.js加载静态文件,像图片之类的,代码如下:

1
2
3
app.use(express.static('../', {
index: false
}));

第三步

接下来需要在app.js里面监听端口,代码如下:

1
2
3
app.listen(8888, function () {
console.log('Example app listening on port 8888!');
});

到此简单的服务器就基本上打好了,假设我们有个haha文件夹,文件夹下面有个index.html文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1.0,maximum-scale=1.0,user-scalable=no,minimal-ui">
</head>
<body>
我是测试文件
</body>
</html>

进入sever文件夹下面,右键gitBash启动Node服务器,命令如下:

1
node app.js

在浏览器输入你电脑的地址就会发现
图

第四步

虽然上面的搭建服务器看上去没什么缺陷,但是实际上我们开发的项目中会有很多问题,以我们的单页面(SPA)为例子,可能会遇见
(1)输入不完整的地址,服务器找不到链接
(2)遇见网站favicon.ico文件,服务器会错误的将favicon.ico识别成网址,这样服务器就会报错

针对第一种情况,我们在app.js里面的代码:

1
2
3
4
5
6
7
8
9
10
11
var urlPath = req.url.match(/\/([^\/]+)/); //比如req.url = 192.168.0.78:8888/jiayou/index,那么urlPath = [ '/jiayou', 'jiayou', index: 0, input: '/jiayou/index' ]
//找不到文件夹名字返回提示
if (!urlPath) {
res.send(req.url + '找不到');
return;
}
//当找不到index.html,自动读取文件夹下的另一个入口文件d.html
var indexHtml = fs.readFileSync('../' + moduleName + '/d.html', 'utf-8');
res.send(indexHtml);

针对第二种情况,我们在app.js里面的代码:

1
2
3
4
5
//防止把favicon.ico当做url
if (moduleName === 'favicon.ico') {
res.send('');
return;
}

那么app.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
var express = require('express');
var app = express();
var fs = require('fs');
app.use(express.static('../', {
index: false
}));
app.use(function(req, res, next) {
var urlPath = req.url.match(/\/([^\/]+)/); //比如req.url = 192.168.0.78:8888/jiayou/index,那么urlPath = [ '/jiayou', 'jiayou', index: 0, input: '/jiayou/index' ]
var moduleName = urlPath[1];
//防止把favicon.ico当做url
if (moduleName === 'favicon.ico') {
res.send('');
return;
}
//找不到文件夹名字返回提示
if (!urlPath) {
res.send(req.url + '找不到');
return;
}
//当找不到index.html,自动读取文件夹下的d.html
var indexHtml = fs.readFileSync('../' + moduleName + '/d.html', 'utf-8');
res.send(indexHtml);
});
app.listen(8888, function () {
console.log('Example app listening on port 8888!');
});

请我喝杯果汁吧!