【问题标题】:ExpressJS RESTapi dynamically set routesExpressJS RESTapi 动态设置路由
【发布时间】:2019-07-12 11:20:58
【问题描述】:

我有一个 expressJS RESTapi 项目。 我的文件夹结构是这样的。

/
/src
 /routes
 /controller
 /models
/app.js

在我的路线文件夹中

/routes
 /banners.routes.js
 /reviews.routes.js
 /users.routes.js

banners.routes.js 文件如下所示

const express = require('express');
    const router = express.Router();
    const passport = require('passport');
    // eslint-disable-next-line no-unused-vars
    const passportConf = require('../../passport');
    const controller = require('../controllers/banner.controller');

    router.post('/', passport.authenticate('jwt', { session: false }), controller.read);

    module.exports = router;

在我的 app.js 文件中

const banners = require('./src/routes/banners.routes');
const users = require('./src/routes/users.routes');
const reviews = require('./src/routes/reviews.routes');

app.use('/banners', banners);
app.use('/users', users);
app.use('/reviews', reviews);

现在只有我三个。如果我有 100 条不同的路线,我需要这样做 100 次,这是非常低效的。应该有一种方法可以自动执行此操作。

我想到了 stackoverflow 的问题,我可以找到 RESTapis 的解决方案。我创建了一个名为 index.js 的文件并将这个 sn-p 添加到那个

const fs = require('fs');
const path = require('path');
const basename = path.basename(__filename);


fs
  .readdirSync(__dirname)
  .filter(file => (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'))
  .forEach((file) => {
    console.log(file)
  });

这样记录所有文件名。

banners.routes.js
reviews.routes.js
users.routes.js

有没有办法自动化这个路由的事情?

希望你能清楚我的问题。

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

假设您遵循一些命名约定,您可以动态地要求所有文件并实例化所有路由。对于您的具体情况<name>.routes.js 处理/<name> 路由

const fs = require('fs');
const path = require('path');
const POSTFIX = '.routes.js'

// generate [[name, handler]] pairs
module.exports = fs
  .readdirSync(__dirname)
  .filter(file => file.endsWith(POSTFIX))
  .map(file => [path.basename(file, POSTFIX), require(`./${file}`)]);

然后在 app.js 中

const routes = require('./src/routes')

routes.forEach(([name, handler]) => app.use(`/${name}`, handler))

【讨论】:

  • @PareshBarad “每次”是什么意思?这只会在应用程序启动过程中运行一次。除非你手动清理 require 缓存,否则 Require 只会在运行时加载一次文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多