【Express】路由

2021/09/09 09:59:54

示例:

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

app.get("/", function(req, res) {
  res.send("hello world");
});

方法

express 支持所有 HTTP 请求类型

app.get()

作用: 指定 get 方法的路径和对应的回调

示例: app.get('/',(req,res) => {})

app.post()

app.all()

作用: 为所有类型的请求绑定路由

示例: app.all('/',(req,res) => {})

app.route()

作用: 给一个路径设置不同的请求类型处理函数

示例:

app
  .route("/book")
  .get(function(req, res) {
    res.send("Get a random book");
  })
  .post(function(req, res) {
    res.send("Add a book");
  })
  .put(function(req, res) {
    res.send("Update the book");
  });

路由路径

路由路径可以是字符串, 字符串模式, 正则表达式, 如果路径中包含 $ , 需要在设置路由时对 $ 进行转义 ([\$])

字符?, +, *, 和()是正则表达式的对应子集

连字符 - 和点 . 是按照字面意思解释的

查询字符串不属于路由路径的匹配范围

精确匹配

路径直接写为固定路径或字符串时只会在路径完全一致时匹配

// 输入 /about 时匹配
app.get("/about", function(req, res) {
  res.send("about");
});

// 输入 /random.text 时匹配
app.get("/random.text", function(req, res) {
  res.send("random.text");
});

字符串模式

一下列出基于字符串模式的路由路径及可匹配路径

  1. /ab?cd, ? 表示前一个字符可有可无, 可匹配的有: acd, abcd
  2. /ab+cd, + 表示前一个字符可以重复多次, 可匹配的有: abcd, abbcd, abbbbcd
  3. /ab*cd, * 通配符, 表示这个位置可以有任意其他字符, 可匹配的有: abxcd, abRANDOMcd, ab123cd

正则

  1. /a/, 匹配带有 a 的路径
  2. /.*fly$/, 匹配 butterflydragonfly, 但不 butterflyman, dragonflyman等。

路径参数

Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }
app.get("/users/:userId/books/:bookId", function(req, res) {
  res.send(req.params);
});

使用正则进行更精确的控制

Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}

路由处理函数

可以使用类似中间件的多个回调函数来处理请求, 利用 next() 方法来跳转到下一个路由处理函数

多个回调函数

app.get(
  "/example/b",
  function(req, res, next) {
    console.log("the response will be sent by the next function ...");
    next();
  },
  function(req, res) {
    res.send("Hello from B!");
  }
);

回调函数数组

var cb0 = function(req, res, next) {
  console.log("CB0");
  next();
};

var cb1 = function(req, res, next) {
  console.log("CB1");
  next();
};

var cb2 = function(req, res) {
  res.send("Hello from C!");
};

app.get("/example/c", [cb0, cb1, cb2]);

单个函数与数组混用

var cb0 = function(req, res, next) {
  console.log("CB0");
  next();
};

var cb1 = function(req, res, next) {
  console.log("CB1");
  next();
};

app.get("/example/c", [cb0, cb1], (req, res, next) => {
  next();
});

响应方法

调用一下方法会向客户端发送响应, 并终止请求-响应周期, 如果没有调用这些方法

  1. res.download() 提示要下载的文件
  2. res.end() 结束响应过程
  3. res.json() 发送 JSON 响应
  4. res.jsonp() 发送带有 JSONP 支持的 JSON 响应
  5. res.redirect() 重定向请求
  6. res.render() 渲染视图模板
  7. res.send() 发送各种类型的响应
  8. res.sendFile() 将文件作为八位字节流发送
  9. res.sendStatus() 设置响应状态代码,并将其字符串表示形式发送为响应正文