Express API 总结

一些概念

var app = express() // 主应用
var admin = express() //子应用
app.use('/admin', admin) // admin当作子应用 
  • 挂载点
    ‘/admin’ 就是admin的挂载点

app相关

// 设置本地变量
app.locals.pageTitle = '我的个人网站'

app.set('case sensitive routing',true)
// 设置模版引擎
app.set('view engine','ejs')
// 设置模版目录
app.set('views','pages')

// 设置静态资源文件夹
app.use(express.static('dist'))
// 二进制流解析成json
app.use(express.json())
// 表单格式转换成json
app.use(express.urlencoded())

express应用的核心概念主要包括:路由、中间件、模板引擎。

express-demo tree -L 1

├── app.js # 应用的主入口
├── bin  # 启动脚本
├── node_modules # 依赖的模块
├── package.json # node模块的配置文件
├── public # 静态资源,如css、js等存放的目录
├── routes # 路由规则存放的目录
└── views # 模板文件存放的目录

核心概念简介

上面提到,express主要包含三个核心概念:路由、中间件、模板引擎。

注意,笔者这里用的是核心概念这样的字眼,而不是核心模块,为什么呢?这是因为,虽然express的中间件有它的定义规范,但是express的内核源码中,其实是没有所谓的中间件这样的模块的。

言归正传,三者简要的来说就是。

  • 中间件:可以毫不夸张的说,在express应用中,一切皆中间件。各种应用逻辑,如cookie解析、会话处理、日志记录、权限校验等,都是通过中间件来完成的。
  • 路由:地球人都知道,负责寻址的。比如用户发送了个http请求,该定位到哪个资源,就是路由说了算。
  • 模板引擎:负责视图动态渲染。下面会介绍相关配置,以及如何开发自己的模板引擎。
核心概念:路由
路由分类

粗略来说,express主要支持四种类型的路由,下面会分别举例进行说明

  • 字符串类型
  • 字符串模式类型
  • 正则表达式类型
  • 参数类型
    分别举例如下,细节可参考官方文档。
var express = require('express');
var app = express();

// 路由:字符串类型
app.get('/book', function(req, res, next){
	res.send('book');
});

// 路由:字符串模式
app.get('/user/*man', function(req, res, next){
	res.send('user');  // 比如: /user/man, /user/woman
});

// 路由:正则表达式
app.get(/animals?$/, function(req, res, next){
	res.send('animal');  // 比如: /animal, /animals
});

// 路由:命名参数
app.get('/employee/:uid/:age', function(req, res, next){
	res.json(req.params);  // 比如:/111/30,返回 {"uid": 111, "age": 30}
});

app.listen(3000);
路由拆分

当你用的应用越来越复杂,不可避免的,路由规则也会越来越复杂。这个时候,对路由进行拆分是个不错的选择。

我们分别看下两段代码,路由拆分的好处就直观的体现出来了。

路由拆分前

var express = require('express');
var app = express();

app.get('/user/list', function(req, res, next){
	res.send('/list');
});

app.get('/user/detail', function(req, res, next){
	res.send('/detail');
});

app.listen(3000);

这样的代码会带来什么问题呢?无论是新增还是修改路由,都要带着/user前缀,这对于代码的可维护性来说是大忌。这对小应用来说问题不大,但应用复杂度一上来就会是个噩梦。

路由拆分后

可以看到,通过express.Router()进行了路由拆分,新增、修改路由都变得极为便利。

var express = require('express');
var app = express();

var user = express.Router();

user.get('/list', function(req, res, next){
	res.send('/list');
});

user.get('/detail', function(req, res, next){
	res.send('/detail');
});

app.use('/user', user); // mini app,通常做应用拆分

app.listen(3000);
核心概念:中间件

一般学习js的时候,我们都会听到一句话:一切皆对象。而在学习express的过程中,很深的一个感受就是:一切皆中间件。比如常见的请求参数解析、cookie解析、gzip等,都可以通过中间件来完成。

来看下实际例子:


var express = require('express');
var app = express();

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

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

app.use(function(req, res, next) {
	console.log('3');
	res.send('hello');
});

app.listen(3000);

请求 http://127.0.0.1:3000,看下控制台输出,以及浏览器返回内容。

middleware git:(master) node chains.js

应用级中间件 vs 路由级中间件

根据作用范围,中间件分为两大类:

  • 应用级中间件
  • 路由级中间件。

两者的区别不容易说清楚,因为从本质来讲,两类中间件是完全等同的,只是使用场景不同。同一个中间件,既可以是应用级中间件、也可以是路由级中间件。

直接上代码可能更直观。参考下面代码,可以简单粗暴的认为:

应用级中间件:app.use()、app.METHODS()接口中使用的中间件。
路由级中间件:router.use()、router.METHODS()接口中使用的中间件。

var express = require('express');
var app = express();
var user = express.Router();

// 应用级
app.use(function(req, res, next){
	console.log('收到请求,地址为:' + req.url);
	next();
});

// 应用级
app.get('/profile', function(req, res, next){
	res.send('profile');
});

// 路由级
user.use('/list', function(req, res, next){
	res.send('/user/list');
});

// 路由级
user.get('/detail', function(req, res, next){
	res.send('/user/detail');
});

app.use('/user', user);

app.listen(3000);

开发中间件,上面也提到了,中间件的开发是是分分钟的事情,不赘述。

function logger(req, res, next){
	doSomeBusinessLogic(); // 业务逻辑处理,比如权限校验、数据库操作、设置cookie等
	next();  // 如果需要进入下一个中间件进行处理,则调用next();
}

常用中间件,包括但不限于如下。

  • body-parser
  • compression
  • serve-static
  • session
  • cookie-parser
  • morgan
核心概念:模板引擎

模板引擎大家不陌生了,关于express模板引擎的介绍可以参考官方文档.下面主要讲下使用配置、选型等方面的内容。可选的模版引擎,包括但不限于如下模板引擎

  • jade
  • ejs
  • dust.js
  • dot
  • mustache
  • handlerbar
  • nunjunks
配置说明

先看代码。

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

有两个关于模版引擎的配置:

  • views:模版文件放在哪里,默认是在项目根目录下。举个例子:app.set('views', './views')
  • view engine:使用什么模版引擎,举例:app.set('view engine', 'jade')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值