快速路由 - 如何要求包含基于 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
中创建另一个路由器。我不认为顶级路由器在这里做任何事情。只需定义这是一个通用中间件即可。
但是,这至少可以解释前两次调用之间的区别。
我想我缺少一些简单的东西...
简单地说,为什么这样做:
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
中创建另一个路由器。我不认为顶级路由器在这里做任何事情。只需定义这是一个通用中间件即可。
但是,这至少可以解释前两次调用之间的区别。