[Express-02] 路由配置

来源:互联网 发布:阿里云域名备案 编辑:程序博客网 时间:2024/05/21 03:18

这里写图片描述

1、实现路由

express模块为我们提供了一些方法,通过这些方法我们可以很方便的在Express服务器中实现路由。语法如下:

app. <method> ( path,  [callback. . . ] ,  callback)

定义路由分为两部分:
1是HTTP请求方法(通常是GET或者POST);
2是URL指定路径;例如:‘/’用于网站的根目录,‘/login’用于登录页面,’/cart’用于购物车;

实例-4.1: 基本的GET和POST路由

app.get('/', function(req, res) {        res.send("Homepage");});app.get('/login', function(req, res) {         res.send('Login page');});app.get('/cert', function(req, res) {        res.send('Cert  page');});app.post('/save', function() {        res.send('Save  page');});

当Express HTTP 服务器接收一个请求时,他会查找已经为方法和路径定义好的路由。如果找到匹配上,就创建request对象和response对象来管理请求,并将这两个对象传递给路由的回调函数。

Express还提供了一个app.all()方法,它的功能与app.get( )和app.post( )一样。

实例-4.2:

app.all('*',  function(req,  res) {        // 全部路径的全局处理程序});app.all('/user/*',  function(req,  res) {        // user路径的全局处理程序});

2、路由中的参数

1>、查询字符串

这也是最常用的方法,通过在URL后面添加标准的HTTP查询字符串”?key=value&key=value…”添加路由参数到URL路径中,之后在程序里使用url.parse()方法解析request对象的url属性来获取参数。但是这种方式会使得URL变得非常难懂。

下面的代码实现到’/find?author=&title=’的基本GET路由,它接受author和title参数。当真要获取作者和标题的值时,用url.parse()方法创建查询对象。

var  express = require('express'),     url     = require('url'),     app     = express();app.get('/find', function(req, res) {    var url_parts = url.parse(req.url, true);    var query     = url_parts.query;    res.send('Find books, author:' + query.author + ", Title:" + query.title);});

2>、使用正则表达式

定义一个正则表达式作为路由的路径部分。Express使用正则表达式来解析URL并把与表达式匹配的路径作为参数存作为参数数组存储。

使用正则表达式你可以让路径实现不遵循标准的”/”格式模式。

下面,我们实现一个正则表达式解析器,它给位于URL: /book/:的GET请求生成路由参数,代码如下:

app.get(/*\/book\/(\w+)\:(\w+)?$/, function(req, res) {    res.send("Get Book, Chapter:" + req.params[0] + ', Page:' + req.params[1] );});

注意: 参数的值未被赋值。而req.params是与URL路径中的条目匹配的数组。

如果是如下URL:

/book/express路由/107

则,res.send()方法返回的是:

Get Book, Chapter: expre路由,Page:107

3、使用已定义的参数来应用路由参数

下面,先看一个实例:

app.get('/user/:userid', function() {    res.send("Get User," + req.param("userid") );});

假如,URL是:

/user/:1001

res.send()方法返回值是:

Get User, 1001

注意: 使用已定义的参数,可以在路由的路径中按名称定义参数;当定义参数时req.param是一个函数,而不是数组,而req.param( param_name )方法返回参数值。

1> 为已定义的参数定义回调函数

当解析URL时,如果Express发现某个参数有定义的回调函数的话,它就会在调用路由回调函数之前调用参数回调函数。

要注册一个参数的回调函数,需要使用app.param()方法。

app.param( param, function(req, res, next, value) {    // code...........});

req和res与路由回调函数的对象时相同的;
next参数是一个用于已注册的下一个app.param()回调的回调函数(如果有的话)。你必须在回调函数的某处调用next(),否则回调链就会被破坏;
value参数是从URL路径解析的参数的值;

看下面示例代码:

app.param('userid', function(req, res, next, value) {    console.log("Userid: " + value);});

假如URL为:

/user/1329

则console.log()语句显示的将是:

Userid: 1329

下面,是一个完整的应用路由参数的示例代码:

var express = require('express'),    url     = require('url'),    app     = require();app.listen( 2337 );app.get('/', function(req, res) {    res.send("Homepage");});// 使用查询字符串app.get('/find', function(req, res) {    var url_parts = url.parse(req.url, true);    var query = url_parts.query;    var response = "Find Book, Author:" + query.author + ", Title" + query.title;    console.log("\nQuery Url:" + req.originalUrl);    console.log( response );    res.send( response );});// 使用正则表达式app.get(/^\/book\/(\w+):(\w+)?$/, function(req, res) {    var response = "Chapter:" + req.param[0] + ", Page:" + req.param[1];    console.log('\nRegex URL:' + req.orignalUrl);    console.log( response );    res.send( response );});// 使用已定义的参数来应用路由参数app.get('/user/:userid', function(req, res) {    var response = "Get userid: " + req.param('userid');    console.log('\nParam URL:' + req.originalUrl);    console.log( response );    res.send( response );});// 给已定义的参数定义回调函数app.param('userid', function(req, res, next, value) {    console.log('\nRequest received with userid: ' + value);    next();  // 不要忘记还有它});
1 0
原创粉丝点击