路由
约 1770 字大约 6 分钟
2025-03-13
一、简介
Express 中路由和 Node.js 中的路由是一个概念,都是指的是将一个 URL 路径和一个资源的映射关系。路由可以指向服务器中一个确定的静态资源(如网页、css、js、图片等),也可以指向服务器开放的服务接口。
二、基础使用
1、基本语法
路由的定义由如下结构组成:app.METHOD(PATH, HANDLER)
。其中:
app
是一个express
实例;METHOD
是某个 HTTP 请求方式 中的一个,一般为all
、post
、get
、put
、delete
;PATH
是服务器端的路径,可以直接指定、也可以使用正则表达式匹配,其中也可以包含动态参数HANDLER
是当路由匹配到时需要执行的函数。它可以是一个函数,也可以是一组函数。一般我们默认最后一个是 回调函数,其他的叫做 中间件 函数,区别在于中间件函数的参数列表里多了一个next
,意思为执行下一个回调函数(或中间件);
一般建议路由的规划和命名遵循 Restful Api
的风格,以下为常见的五种路由方法:
// 匹配API为前缀、请求方法任意类型的的路由
app.all("/api/(.*)", function (req, res) {
res.send("Hello World!");
});
// 对网站首页的访问返回 "Hello World!" 字样
app.get("/", function (req, res) {
res.send("Hello World!");
});
// 网站首页接受 POST 请求
app.post("/", function (req, res) {
res.send("Got a POST request");
});
// /user 节点接受 PUT 请求
app.put("/user", function (req, res) {
res.send("Got a PUT request at /user");
});
// /user 节点接受 DELETE 请求
app.delete("/user", function (req, res) {
res.send("Got a DELETE request at /user");
});
2、路由的匹配规则
路由的匹配遵循以下两点规则,匹配成功后交给对应的回调函数处理:
按照定义的先后循序进行匹配;
请求路径和请求类型一致才会匹配成功;
匹配到结果后,就不再向后匹配了;
最后一定要有一个
app.all('*')
来处理匹配不到的路由
3、404 路由
一般路由列表里最后一个路由需要设置为 404 路由。我们可以设置重定向到首页。
// 显示 404
app.all("*", (req, res) => {
res.send("<h1>404 Not Found</h1>");
});
// 未匹配的路由重定向首页
app.use("/", (req, res) => {
let indexUrl = req.baseUrl ? req.baseUrl + "/index.html" : "/index.html";
res.redirect(indexUrl);
return "";
});
4、动态路由传参
我们需要注意一个问题,原生的 params
是一个字符串,我们可以使用一些中间件去全局处理将其提前转化为 json
格式
// 通过res.params对象,可以访问到URL中,通过 : 匹配到的动态参数
// URL地址中,可以通过 : 参数名的形式,匹配动态参数值
app.get("/user/:id", (req, res) => {
// req.params默认是一个空对象
// 里面存放着通过 : 动态匹配到的参数值
console.log(req.params.id);
});
三、请求报文和响应报文
报文操作方式兼容 http 模块原生写法
1、请求报文
请求报文指的是路由的请求报文,我们可以在回调函数、中间件里获取它。
例如以下代码中 request
为路由的请求报文。其结果可以参考 HTTP 请求报文。
app.get("/", function (request, response) {
console.log(request);
});
请求报文的处理,比如:cookie
的读写、header
报文的读写、根据请求报文参数完成身份校验和权限校验。
中间件 body-parser
Express
可以使用 body-parser
包处理请求体,将请求报文体的字符串格式(querystring
)转化为 json
const bodyParser = require('body-parser');
//处理 querystring 格式的请求体
let urlParser = bodyParser.urlencoded({extended:false}));
//处理 JSON 格式的请求体
let jsonParser = bodyParser.json();
app.post('/login', urlParser, (request,response)=>{
//获取请求体数据
//console.log(request.body);
//用户名
console.log(request.body.username);
//密码
console.log(request.body.userpass);
response.send('获取请求体数据');
});
输出结果
{ "username": "admin", "userpass": "123456" }
2、响应报文
响应报文指的是路由的响应报文,我们可以在回调函数、中间件里获取它。
例如以下代码中 response
为路由的请求报文。其报文解构可以参考 HTTP 响应报文。
app.get("/", function (request, response) {
console.log(request);
response.send("hello world!");
});
响应报文的处理,比如:给响应头添加 CORS
信息、格式化查询结果、根据请求信息返回对应的某个静态资源、下载文件、重定向到某个页面等。
常见的响应类型:
//导入 express
const express = require("express");
//创建应用对象
const app = express();
//创建路由
app.get("/response", (req, res) => {
//原生响应
res.statusCode = 404;
res.statusMessage = "love";
res.setHeader("xxx", "yyy");
res.write("hello express ");
res.end("response");
//express 响应
res.status(500);
res.set("aaa", "bbb"); // 修改header
res.send("你好 Express"); // 响应一段文本
// 其他类型
res.redirect("/login"); // 重定向到某个页面
res.download(__dirname + "/package.json"); // 下载某个文件
res.json(Object); // 响应一个 json 对象
res.sendFile(__dirname + "/test.html"); // path.resolve()把一个文件的内容作为响应
res.status(500).set("abc", "def").send("这都是 OK 的");
});
//监听端口, 启动服务
app.listen(3000, () => {
console.log("服务已经启动, 端口 3000 正在监听中....");
});
四、路由保护(借助中间件)
路由保护(Route protection)是一种在访问某个 URL 之前验证用户身份的机制。这是为了确保只有经过身份验证的用户可以访问一些受保护的页面或资源。在 Express.js 中,可以使用中间件来实现路由保护。中间件是在请求到达路由处理程序之前执行的功能函数。
例如:
function isAuthenticated(req, res, next) {
// 在这里验证用户是否经过身份验证,例如检查session或JWT
if (userAuthenticated) {
// 用户经过身份验证,继续到下一个处理程序
next();
} else {
// 用户未经过身份验证,重定向到登录页面
res.redirect("/login");
}
}
app.get("/dashboard", isAuthenticated, (req, res) => {
// 在这里返回仪表板页面的内容
});
在上面的例子中,isAuthenticated
函数是一个中间件,用于验证用户是否经过身份验证。如果用户被认证,则请求将继续到下一个处理程序;否则,用户将被重定向到登录页面。这样可以保护/dashboard 路由,只有经过身份验证的用户才能访问这个页面。
五、重定向
在 Express.js 中,重定向(Redirect) 是一种通过改变浏览器请求的 URL 来将用户导航到不同的页面的行为。这通常用于将用户从一个 URL 重定向到另一个 URL,例如在用户成功登录后将其重定向到仪表板页面。可以使用res.redirect
方法来实现重定向,只需提供要重定向到的 URL 作为参数。
例如,以下代码将使用 Express
路由来处理用户的登录请求,并在认证成功后将其重定向到 /dashboard
页面,认证失败则跳转到/login
页面
app.post("/login", (req, res) => {
// 在这里进行用户认证逻辑
if (userAuthenticated) {
// 重定向到仪表板页面
res.redirect("/dashboard");
} else {
// 认证失败
res.redirect("/login");
}
});
更新日志
e7112
-1于