快速路由 - 如何要求包含基于 URL 参数的路由的文件?

Express Routing - how to require a file containing routes based on a URL Parameter?

我想我缺少一些简单的东西...

简单地说,为什么这样做:

router.use('/:object', require('../v1/routes'));

但这不是吗? [在 Evert 的回答后编辑,如下]

function getRouter(req, res, next) {
    return require('../v1/routes');
}

router.use('/:object', getRouter());

其中“../v1/routes”仅包含:

const express = require('express');
const router = express.router({ mergeParams: true });

router.get('/', getAll);

function getAll(req, res, next) {
    res.send("Hello");
}

module.exports = router;

我希望使用 API 版本作为文件系统基础动态要求文件。在链的更上方,我得到 API 版本作为 URL 的一部分,所以我希望用它来驱动包含的路由文件的目录:

function getRouter(req, res, next) {
    return require(`../${req.params.apiVersion}/routes`);
}

有没有办法通过动态要求其文件路径来包含路由器?

感谢您的帮助。

编辑 1 如果我 return 我原来的函数调用:

function getRouter(req, res, next) {
    console.log(req.params.apiVersion);
    return require(`../${req.params.apiVersion}/routes`);
}

router.use('/:object', getRouter);

我实际上在控制台日志中写入 'v1';所以参数实际上在那里,但是 'return require'... 似乎并没有像我想象的那样工作。

编辑 2 - 解决方案 感谢 Evert 的提示,我最终到达了那里:

function getRouter(req, res, next) {
    const dynamicRouter = require(`../${req.params.apiVersion}/routes`);
    return dynamicRouter(req, res, next);
}

router.use('/:object', getRouter);

我只回答这个问题的第一部分。

这两个不等价:

// #1
router.use('/:object', require('../v1/routes'));

// #2
function getRouter() {
   return require('../v1/routes');
}
router.use('/:object', getRouter);

在第一个片段中,您将 require 的结果返回给 router.use。在第二个中,您返回一个 函数 ,returns getRouter() 的结果到 router.use。

为了使它们等效,第二个必须如下所示:

router.use('/:object', getRouter());

现在我们调用 getRouter 而不仅仅是传递它。

总的来说,我认为这种模式确实很奇怪。特别是因为您正在 v1/routes 中创建另一个路由器。我不认为顶级路由器在这里做任何事情。只需定义这是一个通用中间件即可。

但是,这至少可以解释前两次调用之间的区别。