文章目录
一、前言
二、正则表达式注册路由
---完整测试代码如下
三、req.params获取路由中的参数
最终效果
---完整测试代码如下
额外注意
上篇文章我们讲了express之注册路由app.get、app.use、app.all 的区别,详细可参考博文:Node.js后端开发 - 进阶篇 #4 express之注册路由app.get、app.use、app.all 的区别,这篇文章我们将讲解正则表达式注册路由,以及req.params获取路由中的参数
上篇文章我们讲到这样一段代码,如下
//注册一个get请求 /register 的路由
//此注册路由的意思:
//1、请求方法必须是get
//2、请求路径的 pathname 必须等于(===)/register
app.get('/register', function (req, res) {
res.send('register')
});
然后我们在发送请求的时候,需要注意的是:
(1)它区别请求方法,get/post/put等请求必须一一对应上,才能匹配到
(2)请求路径pathname必须和 /register 完全匹配
现在我们有一个需求,就是 /register、/register/xxx、/register/xxx/yyy 等都能匹配,/registerabcd不让它匹配,那么这个怎么实现呢?这个时候我们可以使用正则表达式,如下
app.get(/^\/register(\/.+)*$/, function (req, res) {
res.send('register')
});
/^\/register(\/.+)*$/ 这个就是我们写的正则表达式,
其中 /^ 表示正则表达式的开头,
$/ 表示结尾,
\/ 这个是斜杆/ 的转义,
(\/.+)* 其中 .+ 表示任意字符出现一次或多次,*表示小括号里面的出现零次或多次。
如果xxx表示任意字符,也就是/xxx会出现零次或多次。这样就实现了我们上面的需求了,
//1、加载express模块
// const express:声明express变量,
// 这个express变量它是一个对象,它也可以作为一个函数来调用
const express = require('express');
//2、创建一个app对象( 类似于创建一个server对象 )
const app = express();//express作为一个函数来调用
//---------注册路由---------
//通过中间件监听指定的路由的请求
app.get(/^\/register(\/.+)*$/, function (req, res) {
res.send('register')
});
//3、启动服务
//参数1:要监听的端口 参数2:回调函数
app.listen(3000, function () {
console.log('http://localhost:3030');
});
我们可以在浏览器中输入地址试试
http://localhost:3000/register
http://localhost:3000/register/xxx
http://localhost:3000/register/xxx/yyy
所以说我们注册路由,既可以像 /register 这样写死,也可以用正则表达式来匹配,你写的正则表达式越丰富它的功能就越强大。
我们有时候经常会看到这样的路径:http://localhost:3000/news/2018/12/08 去请求或传参数,那么这种情况我们nodejs后端的路由怎么来写呢?我们没讲express框架之前,是这样获取的(详见:Node.js后端开发 - 基础篇 #15 web 服务器 part 7 使用 GET 或 POST 请求发送数据)
var params = url.parse(request.url, true).query;
下面我们来看看express框架是怎么得到的,看如下的代码
app.get('/news/:year/:month/:day', function (req, res) {
res.send(req.params);
});
//1、加载express模块
// const express:声明express变量,
// 这个express变量它是一个对象,它也可以作为一个函数来调用
const express = require('express');
//2、创建一个app对象( 类似于创建一个server对象 )
const app = express();//express作为一个函数来调用
//---------注册路由---------
//通过中间件监听指定的路由的请求
app.get('/news/:year/:month/:day', function (req, res) {
res.send(req.params);
});
//3、启动服务
//参数1:要监听的端口 参数2:回调函数
app.listen(3000, function () {
console.log('http://localhost:3030');
});
1、你也可以这样 req.params.year 单独获取某一个参数,那么得到的值是2018
2、另外几个字段名,可以随自己定义,如我把day改为xxx
app.get('/news/:year/:month/:xxx', function (req, res) {
res.send(req.params.xxx);
});
那么得到的这个xxx的值为08