Express Router-具有相同后缀的不同路由

时间:2019-04-17 10:59:30

标签: node.js express

我有2条路线:

  1. /api/system/list-列出我的系统
  2. /api/system/:systemId/books/list-列出当前系统的书

每个API都有不同的文件:

systemAPI.js:

const list = router.get('/list', Validate(Validation.list), listHandler)
return {
    routes: [list]
}

bookAPI.js:

const list = router.get('/list', Validate(Validation.list), listHandler)
return {
    routes: [list]
}

最后,使用以上路线:

express.use('/api/system', systemAPI.routes)
express.use('/api/system/:systemId/book', bookAPI.routes)

问题是,当我输入列表书API(/api/system/:systemId/books/list)时,它实际上调用了列表系统API(/api/system/list

更新:已解决!

我有两个主要问题:

  1. 路线顺序(在app.use(..)中)
  2. 在每个API上使用Express.Router()的不同实例

有关更多信息,请参考下面的答案。

1 个答案:

答案 0 :(得分:1)

尝试颠倒路线顺序,这可能会解决您的问题:

express.use('/api/system/:systemId/book', bookAPI.routes);
express.use('/api/system', systemAPI.routes);

原因是express会“贪婪地”评估路由,甚至会解析为部分匹配。因此,重要的是要先保留更具体的路由,然后再保留更通用的路由。

此外,我认为您根据documentation systemAPI使用了错误的快速路由器:

const express = require('express');
const router = express.Router();
router.get('/list', Validate(Validation.list), listHandler)

module.exports = router;

bookAPI路线:

const express = require('express');
const router = express.Router();
router.get('/list', Validate(Validation.list), listHandler)

module.exports = router;

最后导入路由器并使用它们:

const express = require('express');
const bookRouter = require('./bookAPI'); //set the file paths based on your file structure
const systemRouter = require('./systemAPI');
const app = express();

app.use('/api/system/:systemId/book', bookRouter);
app.use('/api/system', systemRouter);