Node.js ExpressJS中带路径变量的链式路由
我试图在Node.js中开发一个链接快速路线的系统。其想法是您可以有一个url,如:Node.js ExpressJS中带路径变量的链式路由,node.js,express,Node.js,Express,我试图在Node.js中开发一个链接快速路线的系统。其想法是您可以有一个url,如: api.foo/<someFooId>/bar/<someBarId> 那么routes/foo.js将是: var express = require('express'); var router = express.Router(); var bar = require('./bar'); app.use('/:fooId/bar', bar); 然后,上面显示的URL模式最终将
api.foo/<someFooId>/bar/<someBarId>
那么routes/foo.js
将是:
var express = require('express');
var router = express.Router();
var bar = require('./bar');
app.use('/:fooId/bar', bar);
然后,上面显示的URL模式最终将由routes/bar.js
处理:
var express = require('express');
var router = express.Router();
router.get('/:barId', function(req, res) {
...
}
此系统正确地将到上述URL模式的请求路由到
bar
的路由,但是req
对象不包含fooId
。我想知道是否有人知道我的bar
路线如何访问fooId
我会按照Datsik说的那样,router.get('api/foo/:fooId/bar/:barId')
如果您确实需要将这两个部分分开,您可以将:fooid
的值附加到req
上,然后附加条
路径
大概,
在Foo.js中
router.get('/api/foo/:fooId', function (req, res, next) {
// build data on request.
req.fooId = req.params.fooId;
req.test = 'this is how you add data to req';
next();
});
// attach bar
router.get('/api/foo/:fooId', require('./bar'));
在bar.js中
router.get('/bar/:barId', function (req, res, next) {
var fooId = req.fooId; // its getting the value from `req`
})
如果你碰巧读过,就把我以前写的都忘了
您必须将参数留给路由器本身。也就是说,路由器拥有正则表达式并进行匹配以从url中获取参数
因此,如果需要参数,必须执行以下操作:
var express = require('express');
// helper to get some info
function info(req){
var params = JSON.stringify(req.params);
return (
'<ul>' +
'<li>' + ' path: ' + req.originalUrl + '</li>' +
'<li>' + ' params: ' + params + '</li>' +
'</ul>'
);
}
var fooRouter = express.Router();
fooRouter.get('/:id', function(req, res){
res.send(info(req));
});
fooRouter.get('/:id/bar', function(req, res){
res.send(info(req));
});
var app = express();
app.use('/page', fooRouter);
app.listen(3000, function(){
console.log('server listening on http://localhost:3000');
});
var express=require('express');
//帮助者获取一些信息
功能信息(req){
var params=JSON.stringify(req.params);
返回(
“”+
“- ”+”路径:“+req.originalUrl+”
”+
“- ”+”参数:“+params+”
”+
“
”
);
}
var fooorouter=express.Router();
fooRouter.get('/:id',函数(req,res){
res.send(信息(请求));
});
fooRouter.get('/:id/bar',函数(req,res){
res.send(信息(请求));
});
var-app=express();
应用程序使用('/page',fooRouter);
app.listen(3000,函数(){
console.log('正在侦听的服务器http://localhost:3000');
});
您在这里要实现的主要目标是什么?我的目标是使用链接路由模块实现对所示URL模式的处理。出于好奇和可读性,为什么不仅仅是router.get('/:fooId/:barId')
?如果foo
也有子数组baz
呢?它需要区分它们。这根本不能解决我的问题。我正在尝试访问由更高级别的中间件解析的路径变量,不过我将接受建议中URL结构的建议。将路径变量附加到“req”上,您可以在整个路由堆栈中访问它们。这就是我正在尝试做的。我不知道“我不明白怎么回事。如果你编辑你的答案来包含这些信息,并且它是有效的,我会接受它,试一试。基本上,这就是我想要的。我对它进行了调整,以便不是每个对/api/foo/:fooId
的调用都会被路由到条处理程序,只要它是/api/foo/:fooId/bar
。如果有机会,请更新一件事。Foo.js中的最后一行应该是router。使用(…
而不是router.get(…
var express = require('express');
// helper to get some info
function info(req){
var params = JSON.stringify(req.params);
return (
'<ul>' +
'<li>' + ' path: ' + req.originalUrl + '</li>' +
'<li>' + ' params: ' + params + '</li>' +
'</ul>'
);
}
var fooRouter = express.Router();
fooRouter.get('/:id', function(req, res){
res.send(info(req));
});
fooRouter.get('/:id/bar', function(req, res){
res.send(info(req));
});
var app = express();
app.use('/page', fooRouter);
app.listen(3000, function(){
console.log('server listening on http://localhost:3000');
});