express API解析
1.router.param([name,] callback)
添加一个请求路径中指定参数触发的回调函数。name是参数名字或者是参数名字的数组,函数是对应的回调函数。回调函数的参数依次是req,res和中间件函数next,和对应参数的值。
如果name是一个数组。回调函数依次被数组中的参数触发。更进一步,除了最后一个参数之外,回调函数到下一个回调函数之间都会调用next。
对于最后一个参数,目前正在处理的函数调用next进入下一个中间件,就和name是字符串一样。
例如::user获取到了
。你可以把user自动映射到req.user上,它并入到路径中。或执行验证的参数输入。
router.param('user', function(req, res, next, id) { // try to get the user details from the User model and attach it to the request object User.find(id, function(err, user) { if (err) { next(err); } else if (user) { req.user = user; next(); } else { next(new Error('failed to load user')); } }); });
该回调函数是本地路由上定义它们的,它不能通过挂载app或者被router继承。因此,在router上定义的参数回调函数只能通过在router中routers上定义的参数被触发(app.use和app.router是隔离的两种处理模式,主要表现在layer.router的值上)。
一个参数回调函数在请求和响应的过程中只能触发一次,即使是这个参数被匹配在多个路径上,例如下面的例子:
router.param('id', function (req, res, next, id) { console.log('CALLED ONLY ONCE'); next(); }) app.get('/user/:id', function (req, res, next) { console.log('although this matches'); next(); }); app.get('/user/:id', function (req, res) { console.log('and this matches too'); res.end(); });
请求为: GET /user/4
结果是:
CALLED ONLY ONCE although this matches and this matches too
router.param(['id', 'page'], function (req, res, next, value) { console.log('CALLED ONLY ONCE with', value); next(); }) app.get('/user/:id/:page', function (req, res, next) { console.log('although this matches'); next(); }); app.get('/user/:id/:page', function (req, res) { console.log('and this matches too'); res.end(); })
请求是: /user/42/3
结果是:
CALLED ONLY ONCE with 42 CALLED ONLY ONCE with 3 although this matches and this matches too
2.req.baseUrl
一个router实例设置的URL路径,也就是只有app.use挂载的路径叫baseUrl。
var greet = express.Router(); greet.get('/jp', function (req, res) { console.log(req.baseUrl); // /greet res.send('Konichiwa!'); }); app.use('/greet', greet); // load the router on '/greet'
即使你对加载router使用一个路径模式或者一组路径模式,baseUrl属性返回一个匹配的字符串,而不是路径。下面的例子是,greet被加载有两个路径模式。
app.use(['/gre+t', '/hel{2}o'], greet); // load the router on '/gre+t' and '/hel{2}o'
当一个请求是/greet/ip,那个req.baseUrl是/greet.当请求是/hello/jp,那req,baseUrl是/hello。
req.baseUrl类似于app对象的mountpath属性,除了 app.mountpath返回的一个路径的匹配模式。
具体可以参考:https://segmentfault.com/q/1010000007085050/a-1020000007085142
3.router.route(path)
返回一个router的实例,这个实例能够调用HTTP的请求方法来处理中间件,如(get,post,head,等等),它能避免重复使用相同名字的router而报错。
例如:
var router = express.Router(); router.param('user_id', function(req, res, next, id) { // sample user, would actually fetch from DB, etc... req.user = { id: id, name: 'TJ' }; next(); }); router.route('/users/:user_id') .all(function(req, res, next) { // runs for all HTTP verbs first // think of it as route specific middleware! next(); }) .get(function(req, res, next) { res.json(req.user); }) .put(function(req, res, next) { // just an example of maybe updating the user req.user.name = req.params.name; // save user ... etc res.json(req.user); }) .post(function(req, res, next) { next(new Error('not implemented')); }) .delete(function(req, res, next) { next(new Error('not implemented')); })
4.sendFile
module.exports = function(req, res, opt) { var applyNo = req.query.applyNo; console.log("applyNo:"+applyNo); var file = path.resolve(__dirname, "../../web/repay_jld.html"); res.sendFile(file); } //页面跳转到repay_jld.html //如果请求的url中有applyNo参数,那么repay_jld.html //也会带有applyNo参数