Node.js ExpressJS中带路径变量的链式路由

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模式最终将

我试图在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模式最终将由
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');
});