启动服务
在看过express文档的其实都挺清楚怎么启动一个简单的web服务器。文档是实现一个我们最熟悉的hello world!
文档示例如下:1
2
3
4
5
6
7
8
9
10
11
12
13var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
然后再执行1
node ./app.js //上面代码所在文件为app.js
我们的代码基本类似,express本身提供的有路由这个中间,我们就没必要再去自己用源生的http去写了。
为了让代码看起来好看点,或者说优雅点,就出现了上一期所说的情况,有一个web_router这样的一个文件。
app.js 摘出来一些关键代码,如下:1
2
3
4
5
6
7const express = require('express');
const app = express();
const webRouter = require('./web_router');
app.use('/',webRouter);
app.listen(9000,function(){
console.log('server is running at http://localhost:9000/')
})
路由
web_router.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
38var express = require('express');
/**
* 引入controller
*/
var site = require('./controllers/site');
var auth = require('./middlewares/auth');
var server = require('./controllers/server');
var router = express.Router();
//首页
router.get('/',auth.userRequired,site.index);
//登录
router.get('/login',site.login);
//接口详情
router.get('/details/:item',auth.userRequired,site.details);
//添加分类
router.get('/addProject',auth.userRequired,site.addProject);
router.get('/addCategory/:id',auth.userRequired,site.addCategory);
router.get('/addInterface/:id',auth.userRequired,site.addInterface);
router.get('/edit',auth.userRequired,site.edit);
/**
* 接口请求
*/
router.post('/login/validate.no',server.validate);
router.get('/login/loginout.no',server.loginout);
router.post('/add/addProject',server.addProject);
router.post('/add/addCategory',server.addCategory);
router.post('/add/addInterface',server.addInterface);
router.post('/add/step2',server.addProject);
router.post('/recive/pro',server.getPro);
router.post('/eidt/interface',server.editInterface);
module.exports = router;
在这里需要解释一点,因为是运行在服务器端,node环境本身对es6的支持还算不错,所以这里并没有用babel进行es6的转译。
router 实例本身的方法有几个,但是一般情况下,只用到了get以及post方法。方法第一个参数是一个字符串,表示请求的url路径,后面可根据业务添加多个方法。
以添加分类方法为例,第一个参数 ‘/addProject’,指的是url(即localhost:9000/addProject)
第二个参数 auth.userRequired 是一个方法,从字面上也大致能猜出来,值需要用户登录,这就相当于一个拦截器,如果用户登录了,就执行后面的一个方法,否则,就做另外一个件事情。
后面理论上可以添加N个方法,但实际上肯定不会是这样子的~。
第三个参数 site.addProject 其实也就该进行页面的渲染了。
接下来,就是关于页面如何渲染了。
页面渲染
这里就又要再去提一下app.js了,上面的代码并不全。首先,模板引擎选择的是ejs-mate.比ejs多了一个layout功能,也就是可以有最终的layout。
这个layout也就是一个最基本的架子,现在移步view这个目录下大致看一下。
1 | └── view |
可以看到layout.html 这个文件,这个就是那个骨架了。
1 |
|
页面布局是左侧导航,右侧内容的形式,引入的nav占领左边,body里面的内容,有其他的来填充。
下面来说如何进行渲染。关于html部分,建议大家参考ejs,也就只是一个普通的前端模板引擎。
以首页为例:1
2
3
4
5
6
7
8exports.index = function(req,res,next){
backData.index(req,res,next).then(function(result){
res.render('index',{topic:{title:'首页'},info:{username:req.session.username},nav:result});
}).catch(function(err){
logger.error(err);
res.render('index',{topic:{title:'首页'},info:{username:req.session.username},nav:err});
});
};
res.render() 方法来进行渲染。该方法需要两个参数,第一个是渲染的模板名称,第二个是里面所需要的数据。数据会传到页面,这个就很类似我们平时的那种数据填充了。
该示例说的是使用layout的,还可以不使用layout(有些情况下就是有这样的需求);
1 | res.render404 = function(error){ |
就比如我们渲染404或者错误页面,要这个layout确实没有什么用了吧。
到此为止,基本上一个简单的服务器,小伙伴们也可以自己动手来搭一个玩玩了。直接copy我的代码,你肯定是走不通的,程序员嘛,还是多动手动脑比较好,拿来主义并不适合我们~~