express 基础

基于 Node.js 平台的 web 应用开发框架,并且不会对 Node.js已有的特性进行二次抽象。

安装:

1
2
npm : npm install express
yarn : yarn add express

导入:

1
2
const express = require('express');
const app = express(); // app为express的实例

路由功能 router

路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。

每一个路由都可以有一个或者多个处理器函数,当匹配到路由时,这些函数将被执行。

路由的定义由如下结构组成:
app.METHOD(PATH, HANDLER)
其中, app 是express的实例;METHOD 为某个 HTTP 请求方式,PATH 是服务器端的路径;HANDLER 是当路由匹配到时需要执行的函数。

1
2
3
4
5
6
//对网站首页的访问返回 hello world
app.get('/index', function(req, res)){
res.send('hello world'); //send不需要再res.end()
};
app.listen(80);
//通过访问 127.0.0.1/index 即可显示 hello world

路由匹配

app.METHOD是精确获取
app.use是模糊获取,监听路由下的所有子路有都会被监听。
例如:

1
2
3
4
5
6
7
8
9
// 精确的匹配,只能是/a
app.all('/a', function(req, res){
res.send('hahaha');
});
// use 相当是我当前监听路径下的所有子路由都会被监听,包括/a/b/c
app.use('/a', function(req, res){
res.send('use');
});

模糊匹配:冒号

1
2
3
4
5
app.get('/a/:id', function(req, res){
//此时id是一个变量,可以通过req.params来访问
res.send(req.params.id);
//返回的就是/a后面的参数
});

express.Router

可使用 express.Router 类创建模块化、可挂载的路由句柄。Router 实例是一个完整的中间件和路由系统,因此常称其为一个 “mini-app”。

主界面:

1
2
3
4
5
6
const express = require('express');
const app = express();
//导入同级的news.js
const news = require('./news.js');
app.use('/news', news).listen(80);

news.js 模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
const express = require('express');
//创建一个路由
const router = express.Router();
//不需要再加/news,根路由已经变成/news
router.get('/', function(req, res){
res.send('新闻内容');
});
router.get('/today', function(req, res){
res.send('今日热点');
});
//导出模块
module.exports = router;

通过访问 127.0.0.1/news 就能显示新闻内容,访问 127.0.0.1/news/today 就能显示今日热点

参数获取

req.query 获取get请求的参数

获取 post 参数

通过 第三方中间件 body-parser 来实现。

注: 在express3.X版本中是集成了body-parser ,但是在4.X版本中已经去掉了,需要手动集成

安装方法:yarn add body-parser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express = require('express');
const app = express();
const bodyParser = require('body-parser')
//解析 application/json
app.use(bodyParser.json());
//解析 application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extenden: true}));
//接收post请求
app.post('/', function(req, res){
//使用body-parser就能通过req.body来获取客户端POST过来的数据,是一个对象
res.json(req.body); //req.json返回json数据
}).listen(80);

错误处理

定义错误处理中间件和定义其他中间件一样,除了需要 4 个参数,而不是 3 个,其格式如下 (err, req, res, next)。

处理错误的中间件:

1
2
3
app.use(function(err, req, res, next){
console.log(err);
})

如果向 next() 传入参数(除了 ‘route’ 字符串),Express 会认为当前请求有错误的输出,因此跳过后续其他非错误处理和路由/中间件函数。

1
2
3
4
5
6
app.get('/', function(req, res, next){
if(err){
//继续处理该错误
next(err);
}
})

静态文件托管

利用 express 内置的 express.static 可以方便地托管静态文件。例如图片、CSS、JS 文件等。
app.use(express.static(public));
现在,public 下的文件就可以访问了。
127.0.0.1/images/cat.jpg
127.0.0.1/css/style.css
127.0.0.1/index.html
所有文件的路径都是相对于存放目录的。
如果静态资源吨放在多个目录下面,可以多次调用 express.static 中间件,访问静态资源文件时,会根据目录添加的顺序查找所需的文件。

也可以指定一个虚拟路由来挂载静态资源。例如:
app.use('/virtual', express.static('public'));
127.0.0.1/virtual/images/cat.jpg
127.0.0.1/virtual/css/style.css
127.0.0.1/virtual/index.html

模板引擎

通过 express 渲染模板引擎 nunjucks 的具体实现。

1
2
3
4
5
6
7
8
9
10
11
12
//引入模块
const express = require('express');
const app = express();
const nunjucks = require('nunjucks');
//设置放模板文件的目录并且让express支持
nunjucks.configure('views', {express : app});
app.get('/', function(req, res){
//渲染模板
res.render('index.njk', {'user':'shine'});
}).listen(80);