在router.use中定义参数时如何获取参数?
这是Express 4.x. 让我们来看看他们的架构如下:
server.js
var express = require('express'); var mainRouter = express.Router(); var subRouter = express.Router(); subRouter.route('/').get(function(req, res, next) { console.log(req.params); }); mainRouter.use('/:username', subRouter); app.use('/', mainRouter);
然后我打电话GET /Amberlamps
。 我期望req.params
是{ username: 'Amberlamps' }
,但是我得到的是{}
。
但是,如果我在subRouter
我的路由subRouter
为:
subRouter.route('/:city').get(function(req, res, next) { console.log(req.params); });
请致电GET /Amberlamps/Berlin
, req.params
是{ city: 'Berlin' }
。
我如何得到:username
?
编辑:根据要求,我想解释一下,为什么我想使用路由器作为subRouter
路由器。
假设我想要构build一个具有以下架构的RESTful api服务器:
[path_to_api_server]/[version]/[resource]
http//api.example.com/1/users
server.js
mainRouter.use('/:version/items', itemsRouter); mainRouter.use('/:version/messages', messagesRouter); mainRouter.use('/:version/users', usersRouter); app.use('/', mainRouter);
usersRouter.js
var express = require('express'); var usersRouter = express.Router(); usersRouter.route('/') .get(getUser) .post(postUser) .put(putUser) .delete(deleteUser); module.exports = usersRouter;
这样做的好处是每个资源路由器都可以工作,甚至不需要知道它正在监听的path。 然而,资源路由器需要知道在版本中定义的版本号,因为function可能不同。
我有一个可能适合您的需求的答案。 由于子路由器是由主路由器封装的,因此不具有对version
访问权限,添加一个将版本从主路由器传递给子路由器的中间件。
var express = require('express'); var mainRouter = express.Router(); var subRouter = express.Router(); var app = express(); var apiRoutes = { itemRouter : function(req, res, next){ console.log('/items','version',req.version,req.params); next(); }, messagesRouter : function(req, res, next){ console.log('/messages','version',req.version,req.params); next(); }, usersRouter : function(req, res, next){ console.log('/users','version',req.version,req.params); next(); } } subRouter.route('/items/:id').get(apiRoutes.itemRouter); subRouter.route('/messages/:id').get(apiRoutes.messagesRouter); subRouter.route('/users/:id').get(apiRoutes.usersRouter); //attach a middleware that will pass through the version to the subrouter via the request object mainRouter.use('/:version', function(req, res, next){ console.log('version', req.params.version); req.version = req.params.version;//pass version via req object next(); }); //attach your subRouter mainRouter.use('/:version',subRouter) app.use('/', mainRouter); app.listen(3000);