Express路由
Express利用HTTP动作提供了有意义并富有表现力的URL映射API,例如我们可能想让用户帐号的URL看起来像/user/12
的样子,下面的例子就能实现这样的路由,其中与占位标识符(本例为:id)相关的值可以被req.params
获取到。
URL路径和参数看起来没有任何分别,真正的区别在于,将被哪个对象获取,例如:下面例子和对应的URL:http://..../user/12,user将匹配路径,12将匹配参数:id,它将被
req.params
对象获取到。
app.get('/user/:id', function(req, res){ res.send('user ' + req.params.id); });
上例中当我们访问/user/12
时返回“user 12”。
注:app.get相当于在服务器注册了一个监听get请求事件的侦听器,当请求的URL满足第一个参数时,执行后面的回调函数,该过程是异步的。
路由是一个可以被内部编译
成正则表达式
的简单字符串,比如当/user/:id
被编译后,被内部编译后的正则表达式字符串看起来会是下面的样子(简化后):
\/user\/([^\/]+)\/?
要实现复杂点的,我们可以传入正则表达式直接量,因为正则捕获组是匿名的因此我们可以通过req.params
进行访问,第一个捕获组应该是req.params[0]
,第二个应该是req.params[1]
,以此类推。
app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, function(req, res){ res.send(req.params); });
通过不同的url来测试我们定义的路由:
http://127.0.0.1:3000/users/any
[ null, null ]
http://127.0.0.1:3000/users/12
[ "12", null ]
http://127.0.0.1:3000/users/12..28
[ "12", "28" ]
下面是一些路由例子,以及与之相匹配的关联路径:
"/user/:id" /user/12 "/users/:id?" /users/5 /users "/files/*" /files/jquery.js /files/javascripts/jquery.js "/file/*.*" /files/jquery.js /files/javascripts/jquery.js "/user/:id/:operation?" /user/1 /user/1/edit "/products.:format" /products.json /products.xml "/products.:format?" /products.json /products.xml /products "/user/:id.:format?" /user/12 /user/12.json