假设,现在你尝试通过 example.com/someone 访问某人的推特或者微博主页,你会发现该请求的 HTTP 内容大致如下:
GET /someone http/1.1
其中包含了 HTTP 请求使用的方法(GET),URI 信息(/someone) 以及 HTTP 协议版本 (1.1)。
Express 中的路由就是负责将其中的 HTTP 方法和 URI 这对组合映射到对应的中间件。
简单说就是, /about_me 的GET 请求会执行某个中间件而对于 /new_user 的 POST 请求则执行另一个中间件。
下面我们通过一个简单示例来看看到底路由时如何工作的。
下面我们就对 example.com/someone 请求进行一个简单的实现,代码如下:
var express = require("express"); var app = express(); app.get(‘/someone‘, function(request, response) { response.send(" Welcome to someone‘s homepage! "); }); app.use(function(request, response) { response.status(404).send("Page not found!"); }); app.listen(3000);
上面代码中有价值的是第三行:当你通过 HTTP 的 GET 方法对 /someone 发起请求时,程序会执行该中间件中的代码,其他请求则会被忽略并跳转到下一个中间件。
从工作原理来说:路由就是通过对 HTTP 方法和的 URI 的组合进行映射来实现对不同请求的分别处理。
当然,除了上面那种最简单的使用方式之外,Express 的路由还有更多实用的使用技巧和方法。
在上面的使用方式中使用的是全等判断来进行路由匹配的。虽然对于 /someone 这类非常管用。
但是对于形如 /users/1、/users/2 这类 RESTful 路由就明显不那么友好了。
因为如果将后者路由一一列出的话,不管是从工作量还是后期维护来说都是非常差开发体验。针对这种情况,我们可以使用 Express 中含参的通配路由来解决。
该方法的工作原理就是,在路由中使用参数进行通配表示。而该参数所表示的具体数值会在变量 params 中获取到,下面是简单的代码示例:
app.get("/users/:userid", function(req, res) { // 将userId转换为整型 var userId = parseInt(req.params.userid, 10); // ... });
针对上面的问题,我们可以使用正则来对路由进行更精准的匹配。
假设现在我们只需要匹配 /users/123 和 /users/456 这种通配参数为数字的动态路由的同时忽略其他路由格式,那么可以将代码改为:
app.get(/^\/users\/(\d+)$/, function(req, res) { var userId = parseInt(req.params[0], 10); // ... });
通过正则表达式代码对通配参数作为了严格限定:该参数必须是数字类型。
正则表达式可能阅读起来并不是很友好,但是它却可以实现对复杂路由匹配规则的准确定义。
例如,你想匹配路由 /users/100-500 这类表示某个用户范围的列表页面,那么该正则如下:
app.get(/^\/users\/(\d+)-(\d+)$/, function(req, res) { var startId = parseInt(req.params[0], 10); var endId = parseInt(req.params[1], 10); // … });
正则表达式可以让你的路由匹配定义更上一层楼。
原文:https://www.cnblogs.com/magicg/p/12821859.html