banner
Hi my new friend!

Express内容

Scroll down

|

Express 介绍


Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架。 它可以轻松构建各种web应用,例如:
接口服务
传统的web网站
开发工具集成等(例如webpack的devServer)

Express本身是极简的,仅仅提供了web开发的基础功能,但是它通过中间件的方式集成了许许多多的外部插件来处理HTTP请求。
body-parser:解析HTTP请求体
compression:压缩HTTP响应
cookie-parser:解析cookie 数据
cors:处理跨域资源请求
morgan:HTTP请求日志记录

Express中间件的特性固然强大,但是它所提供的灵活性是一把双刃剑。
它让Express本身变得更加灵活和简单
缺点在于虽然有一些中间件包可以解决几乎所有问题或需求,但是挑选合适的包有时也会成为一个挑战
有很多流行框架基于 Express
Express 官网

express 安装

参考文档:http://expressjs.com/en/starter/installing.html

1
2
3
4
5
6
7
8
9
 # 创建并切换到 myapp 目录
mkdir myapp
cd myapp

# 初始化 package.json 文件
npm init -y

# 安装 express 到项目中
npm i express

Hello World

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 0. 加载 Express
const express = require("express");

// 1. 调用 express() 得到一个 app
// 类似于 http.createServer()
const app = express();

// 2. 设置请求对应的处理函数
// 当客户端以 GET 方法请求 / 的时候就会调用第二个参数:请求处理函数
app.get("/", (req, res) => {
res.send("hello world");
});

// 3. 监听端口号,启动 Web 服务
app.listen(3000, () => console.log("app listening on port 3000!"));

基本路由

参考文档:http://expressjs.com/en/starter/basic-routing.html

路由(Routing)是由一个 URI(或者叫路径标识)和一个特定的 HTTP 方法(GET、POST 等)组成的,涉及到应用如何处理响应客户端请求。

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

路由的定义的结构如下:

1
app.METHOD(PATH, HANDLER);

● app 是 express 实例
● METHOD 是一个 HTTP 请求方法
● PATH 是服务端路径(定位标识)
● HANDLER 是当路由匹配到时需要执行的处理函数

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 当你以 GET 方法请求 / 的时候,执行对应的处理函数
app.get("/", function(req, res) {
res.send("Hello World!");
});
// 当你以 POST 方法请求 / 的时候,指定对应的处理函数
app.post("/", function(req, res) {
res.send("Got a POST request");
});
app.put("/user", function(req, res) {
res.send("Got a PUT request at /user");
});
app.delete("/user", function(req, res) {
res.send("Got a DELETE request at /user");
});

路由路径

路由路径与请求方法结合,定义了可以进行请求的端点。路由路径可以是字符串,字符串模式或正则表达式。字符?,+,*,和()是他们的正则表达式的对应的子集。连字符(-)和点(.)由基于字符串的路径按字面意义进行解释。
如果您需要$在路径字符串中使用美元字符(),请将其转义([并括在和中]) 例如,“/data /$book”处用于请求的路径字符串将为$

Express使用path-to-regexp来匹配路由路径; 有关定义路由路径的所有可能性,请参见正则表达式路径文档。Express Route Tester尽管不支持模式匹配,但却是用于测试基本Express路由的便捷工具。

● *查询字符串不是路由路径的一部分。

动态路径

1
2
3
app.get("/users/:userId/books/:bookId", function(req, res) {
res.send(req.params);
});

路径参数

路由参数被命名为URL段,用于捕获URL中在其位置处指定的值。捕获的值将填充到req.params对象中,并将路径中指定的route参数的名称作为其各自的键。

1
2
3
Route path: /flights/ :from-:to
Request URL:http:// localhost: 3000/flights/LAX-SFO
req.params : { "from" : "LAX","to" : "SFO" }

路径参数的名称必须由“文字字符”([A-Za-zO-9_])组成。
由于连字符(-)和点(.)是按字面解释的,因此可以将它们与路由参数一起使用,以实现有用的目的。

1
2
3
Route path : /plantae/ :genus.:species
Request URL: http : // localhost : 3000/plantae/Prunus.persica
req.params : { "genus " : "prunus " , " species " : "persica" }

路由处理方法

app.route()

express.Router

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
onst express = require("express");

const router = express.Router();

router.get("/", function(req, res) {
res.send("home page");
});

router.get("/about", function(req, res) {
res.send("About page");
});
const router = require("./router");

// ...

app.use(router);
module.exports = router;

在 Express 中获取客户端请求参数的三种方式

例如,有一个地址:/a/b/c?foo=bar&id=123

查询字符串参数

1
console.log(req.query);

请求体参数

POST 请求才有请求体,我们需要单独配置 body-parser 中间件才可以获取。
只要程序中配置了 body-parser 中间件,我们就可以通过 req.body 来获取表单 POST 请求体数据。

1
2
req.body
// => 得到一个请求体对象

动态的路径参数

在 Express 中,支持把一个路由设计为动态的。例如:

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
// /users/:id 要求必须以 /users/ 开头,:id 表示动态的,1、2、3、abc、dnsaj 任意都行
// 注意::冒号很重要,如果你不加,则就变成了必须 === /users/id
// 为啥叫 id ,因为是动态的路径,服务器需要单独获取它,所以得给它起一个名字
// 那么我们就可以通过 req.params 来获取路径参数
app.get("/users/:id", (req, res, next) => {
console.log(req.params.id);
});

// /users/*/abc
// req.params.id
app.get("/users/:id/abc", (req, res, next) => {
console.log(req.params.id);
});

// /users/*/*
// req.params.id
// req.params.abc
app.get("/users/:id/:abc", (req, res, next) => {
console.log(req.params.id);
});

// /*/*/*
// req.params.users
app.get("/:users/:id/:abc", (req, res, next) => {
console.log(req.params.id);
});

// /*/id/*
app.get("/:users/id/:abc", (req, res, next) => {
console.log(req.params.id);
});

请求和响应

Express应用使用路由回调函数的参数:request和response 对象来处理请求和响应的数据。
Express不对Node.js 已有的特性进行二次抽象,只是在它之上扩展了web应用所需的基本功能。
● 内部使用的还是 http 模块
● 请求对象继承自: http.IncomingMessage
● 响应对象继承自: http.ServerResponse

处理静态资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 开放 public 目录中的资源
// 不需要访问前缀
app.use(express.static("public"));

// 开放 files 目录资源,同上
app.use(express.static("files"));

// 开放 public 目录,限制访问前缀
app.use("/public", express.static("public"));

// 开放 public 目录资源,限制访问前缀
app.use("/static", express.static("public"));

// 开放 publi 目录,限制访问前缀
// path.join(__dirname, 'public') 会得到一个动态的绝对路径
app.use("/static", express.static(path.join(__dirname, "public")));

Nodejs + express案例