1. 学习路线
Javascript----->原生nodeJS------>Express框架
- Javascript: 嵌入动态文本于HTML页面, 实现网页动态效果
- nodeJS: 使得我们的JavaScript语言能够开发web服务端
- Express: 提供了更高层的接口外,还集成实现了许多常见功能
2. 为什么这样选择
nodeJS: 事件驱动,异步编程,非阻塞式io
- 事件驱动: 事件循环不断检查事件,当有事件来临就可能会有回调函数被调用
- 异步编程: 回调函数,每一个任务有一个或多个回调函数,前一个任务结束后,执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的,下面举个栗子:
一个函数里执行语句ABCD,C语句发起异步请求,同时向引擎注册一个回调事件,接着D完了退出函数块,引擎一直LOOP,如果C异步的请求得到了回应,之前注册的回调函数就会被执行。
- 非阻塞式io: contents在回调函数中才能获取,但是不需要等读完文件就可以执行下一句。
fs.readFile('/etc/hosts', function(err, contents) { console.log(contents); }); console.log('Doing something else');
注意的一点就是,回调函数根本上是任务完成才执行,事件只是使得任务完成。
- nodeJS Core
Express: 开发更有效率,结构更清晰
Express是基于nodeJS的WEB框架,它提供了一个类似MVC的架构,其中C在Web框架里就是路由。
用原生node.js来开发web服务器应用,会有很多的代码冗余,为了提高效率,我们选择了最成熟的nodeJS框架之一的Express。
3. Express框架(4.X)
项目目录
一个好的目录结构有利于我们组织,存放和管理代码。
|__node_modules /*Modules could be used*/
|__routers /*Control the web router*/
|__main.js
|__views /*Interface*/
|__index.html /*Normally the home page*/
|__about.html
|__package.json /*version, dependencies, authors etc.*/
|__app.js /*application in server*/
//public:static files
Express内容
请求&响应
Request和Response本质上都是对象,当收到请求并且请求合法时,他们就会自动生成实例并可以直接在我们的路由处理器中使用。
var express = require("express");
var app = express();
app.get('/user/:id', function(req, res) {
res.send('user ' + req.params.id);
});
路由的控制
就是指为不同的访问路径,指定不同的处理方法,比如前端有用户要求访问\device,有用户要求访问\car, 他们是不一样的请求,就要有对应的路由去处理它。
合理的路由。通常路由是由中间件控制的。
中间件的概念
- app级中间件
- router级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
- ...
之前的介绍已经说了,中间件是起到联系Express和原生node的。
它通常以中间件函数的形式存在
这些分类主要是根据用途以及绑定对象决定的。比如app级绑定的就是express对象,而router级中间件绑定的就是router对象。
next:
app.use(function (req, res, next) {
console.log('in middleware one...');
next();
});
app.use(function (req, res, next) {
console.log('in middleware two...');
next();
});
next执行顺序与代码顺序完全一致
返回页面
我们想要给客户端返回一个页面,需要有以下准备:
模板文件:就是不同的html文件,文件名用来对应不同路径
layout.html:特殊的模板文件,用来控制布局
模板引擎:负责解析渲染
// 指定模板文件的后缀名为html
app.set('view engine', 'html');
// 运行hbs模块
app.engine('html', hbs.__express);
res.render('index',<binding data>);
指定静态文件目录
模板文件默认存放在views子目录。这时,如果要在网页中加载静态文件(比如样式表、图片等),就需要另外指定一个存放静态文件的目录。
app.use(express.static('public'));
上面代码在文件app.js之中,指定静态文件存放的目录是public。于是,当浏览器发出非HTML文件请求时,服务器端就到public目录寻找这个文件。比如,浏览器发出如下的样式表请求:
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet">
服务器端就到public/bootstrap/css/目录中寻找bootstrap.css文件。
4. 与车流量项目的联系
涉及到几乎所有后端逻辑,存储,提取,修改,删除,压缩以及加密。
车流量项目主要有两个逻辑层面,一个是我们地磁设备发出的socket包能为后端正确接收处理并有序存储到数据库;第二个就是我们后台管理系统,后端与前端和数据库的交互。
我们才开始第一个逻辑层面。由于Express主要针对的较高层的业务逻辑,于是我们利用原生nodeJS的net模块处理了接收的socket数据把他作为我们自己写的模块,然后然我们的app.js去使用这个数据处理模块。或者最好是把它们集合在app.js里。
5. Express还能做什么
- Restful API的实现: Express 和 ORM(waterline)
- SSL加密的实现:express().https