提问者:小点点

其余与Express.js嵌套路由器


假设我希望RESTendpoint大致如下所示:

/user/
/user/user_id 

/user/user_id/items/
/user/user_id/items/item_id

CRUD对每个如果都有意义。例如, /userPOST创建一个新用户,GET获取所有用户。 /user/user_idGET只获取一个用户。

项目是特定于用户的,所以我将它们放在user_id下,user_id是一个特定的用户。

现在,为了使Express路由模块化,我做了一些路由器实例。用户有一个路由器,项目有一个路由器。

var userRouter = require('express').Router();
userRouter.route('/')
  .get(function() {})
  .post(function() {})
userRouter.route('/:user_id')
  .get(function() {})

var itemRouter = require('express').Router();
itemRouter.route('/')
  .get(function() {})
  .post(function() {})
itemRouter.route('/:item_id')
  .get(function() {})

app.use('/users', userRouter);

// Now how to add the next router?
// app.use('/users/', itemRouter);

项目的URL是user的URL层次结构的后代。现在,我如何获得URL与/用户无论user路由器,但更具体的路线的/user/*user_id*/项目/到item路由器?此外,如果可能的话,我希望user_id也可以访问itemRout。


共3个答案

匿名用户

您可以通过将路由器作为中间件附加到其他路由器上来嵌套路由器,无论是否使用params

如果要从父路由器访问params,则必须将{mergeParams: true}传递给子路由器。

Express4.5中引入了mergeParams。0(2014年7月5日)

在此示例中,itemRouter连接到/:userId/items路由上的userRouter

这将导致以下可能的路线:

GET/user-

var express = require('express');
var app = express();

var userRouter = express.Router();
// you need to set mergeParams: true on the router,
// if you want to access params from the parent router
var itemRouter = express.Router({mergeParams: true});

// you can nest routers by attaching them as middleware:
userRouter.use('/:userId/items', itemRouter);

userRouter.route('/')
    .get(function (req, res) {
        res.status(200)
            .send('hello users');
    });

userRouter.route('/:userId')
    .get(function (req, res) {
        res.status(200)
            .send('hello user ' + req.params.userId);
    });

itemRouter.route('/')
    .get(function (req, res) {
        res.status(200)
            .send('hello items from user ' + req.params.userId);
    });

itemRouter.route('/:itemId')
    .get(function (req, res) {
        res.status(200)
            .send('hello item ' + req.params.itemId + ' from user ' + req.params.userId);
    });

app.use('/user', userRouter);

app.listen(3003);

匿名用户

我想要一个在快速4中以非常易于管理的方式执行嵌套路线的具体示例,这是“快速嵌套路线”的顶级搜索结果。例如,这里有一个应用编程接口,它有许多需要分解的路由。

./指数js:

var app = require('express')();

// anything beginning with "/api" will go into this
app.use('/api', require('./routes/api'));

app.listen(3000);

./路线/api/index.js:

var router = require('express').Router();

// split up route handling
router.use('/products', require('./products'));
router.use('/categories', require('./categories'));
// etc.

module.exports = router;

./路线/api/products.js:

var router = require('express').Router();

// api/products
router.get('/', function(req, res) {
  res.json({ products: [] });
});

// api/products/:id
router.get('/:id', function(req, res) {
  res.json({ id: req.params.id });
});

module.exports = router;

我注意到一些关于“嵌套文件夹结构”的评论。这是隐含的,但并不明显,所以我添加了以下部分。下面是路由的嵌套文件夹结构的一个特定示例。

index.js
/api
  index.js
  /admin
    index.js
    /users
      index.js
      list.js
    /permissions
      index.js
      list.js

这更像是节点工作方式的一般示例。如果您在文件夹中使用“index.js”,就像在目录默认情况下在网页中使用“index.html”一样,这将很容易根据递归缩放您的组织,而无需将入口点更改为代码。"<-plhd--2/>"是在目录中使用要求时访问的默认文档。

索引的内容。js

const express = require('express');
const router = express.Router();
router.use('/api', require('./api'));
module.exports = router;

/api/index的内容。js

const express = require('express');
const router = express.Router();
router.use('/admin', require('./admin'));
module.exports = router;

/api/admin/index的内容。js

const express = require('express');
const router = express.Router();
router.use('/users', require('./users'));
router.use('/permissions', require('./permissions'));
module.exports = router;

/api/admin/users/index的内容。js

const express = require('express');
const router = express.Router();
router.get('/', require('./list'));
module.exports = router;

这里可能有一些干燥问题,但它确实很适合封装问题。

仅供参考,最近我进入了动作英雄,发现它是全功能的w/套接字和任务,更像一个真正的框架,在它的头上翻转REST范式。你应该去看看裸体快递。

匿名用户

var userRouter = require('express').Router();
var itemRouter = require('express').Router({ mergeParams: true }); 

userRouter.route('/')
  .get(function(req, res) {})
  .post(function(req, res) {})
userRouter.route('/:user_id')
  .get(function() {})

itemRouter.route('/')
  .get(function(req, res) {})
  .post(function(req, res) {})
itemRouter.route('/:item_id')
  .get(function(req, res) {
    return res.send(req.params);
  });

app.use('/user/', userRouter);
app.use('/user/:user_id/item', itemRouter);

问题第二部分的关键是使用mergeParams选项

var itemRouter = require('express').Router({ mergeParams: true }); 

/user/jordan/item/cat我得到一个回复:

{"user_id":"jordan","item_id":"cat"}