要了解Router我们需要先知道到Application,首先,每一个express实例本身内部就内建了router,所以我们先从简单的下手,先使用application;另外这里我们只选择get方法,作为我们Router.Method, 之所以使用get是因为它足够简单;
精确匹配形式
1. get有很多种用法
-
var express = require("express"); -
var app = express(); -
app.get("/example/c",function(req, res){ -
res.send("Your url is /example/c"); -
}); -
app.listen(3000);
2. 参数形式
-
var express = require("express"); -
var app = express(); -
app.get('/user/:userid',function(req, res){ -
res.send(req.params.userid); -
}); -
app.listen(3000,function(){console.log("server is listening on port 3000")});
参数形式另外的高级应用
3. 正则表达式的形式
-
var express = require('express'); -
var app = express(); -
app.get(/example/,function(req, res){ -
res.send('it is use regular expression'); -
}); -
app.listen(3000);
4. 神秘的参数 next
-
var express = require('express'); -
var app = express(); -
var func1 = function(req, res, next){ -
console.log("this is first func"); -
next(); -
} -
var func2 = function(req, res, next){ -
//不能这么写,因为这样就相当于后面有设置了一遍head -
//res.send("this second func"); -
console.log("this is second func"); -
next(); -
} -
var func3 = function(reg,res){ -
console.log("this is thrid func"); -
res.send("this is in the func3, end"); -
} -
//使用方式1 -
app.get("/example/",func1,func2,func3); -
//使用方式2 -
app.get("/example/",[func1,func2,func3]);
匹配好之后就是res
res也有很多种形式
比如jsonp
-
var express = require('express'); -
var app = express(); -
app.get('/example/defaultCallback?callback=foo',function(req, res){ -
res.jsop({"message":"this is default callback"}); -
}); -
app.get('/example/customizeCallback?cb=foo2',function(req, res){ -
app.set("jsonp callback name", 'cb'); -
res.jsonp({"message":"this is customize callback"}); -
}) -
app.listen(3000);
默认情况下:http://localhost:3000/example/b?callback=foo
指定情况下:http://localhost:3000/example/c?cb=foo2
比如redirect
-
app.get("/example/d", function(req, res) { -
var ua = req.get("user-agent"); -
if (!!ua && ua.toLowerCase().match(/android|ipad|iphone|ipod/)) { -
console.log("this is mb"); -
res.redirect("http://m.browser.baidu.com/mb"); -
} else { -
console.log("This is pc"); -
res.redirect("http://m.browser.baidu.com/pc"); -
} -
});
http://localhost:3000/example/d
在chrome里面,打开开发者模式,切换模拟器。
参数形式高级应用
-
var express = require('express'); -
var app = express(); -
app.get('/user/:userage/:userid', function(req, res, next) { -
console.log("in get method: userid:", req.params.userid); -
console.log("in get method: userage:", req.params.userage); -
next(); -
}); -
app.param("userage", function(req, res, next, value, key) { -
console.log("in param key:", key); -
console.log("in param value:", value); -
next(); -
}); -
app.param("userid", function(req, res, next, value, key) { -
console.log("in param key:", key); -
console.log("in param value:", value); -
next(); -
}); -
app.get('/user/:userid/:userage', function(req, res, next) { -
res.send("userid and userage are:", req.params.userid, req.params.userage); -
}); -
app.listen(3000);
前后顺序与app.param的顺序无关,只与
app.get('/user/:userage/:userid', function(req, res, next) 的顺序有关。
OK,Application基本学习完毕了,我们就来说一下Router,其实没有什么大不同,基本上是一致的。
Router有几种参数形式:
1. function(func){}
2. function(url, function){}
第1种主要是针对于这个路由下的所有情况,都会使用经过这个回调函数的处理。
第2种情况是针对于这个路由下的指定的地址,才会触发回调函数的处理。
以下上干货:
-
var express = require("express"); -
var app = express(); -
var router = express.Router(); -
router.use(function(req, res, next) { -
console.log('%s %s %s', req.method, req.url, req.path); -
next(); -
}); -
router.use(express.static(__dirname + "/bar"), function(req, res, next) { -
next(); -
}); -
router.use(function(req, res) { -
res.send("Hello world"); -
}); -
app.use('/foo', router); -
app.listen(3000);
因为在app.use中已经制定了父级目录的地址,所以router只需要针对自己目录进行处理即可。
本文涉及的学习资源来源于
http://expressjs.com/en/4x/api.html#router.METHOD