ExpressJS RESTapi动态设置路由

时间:2019-07-12 11:20:58

标签: javascript node.js express

我有一个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 的文件,并将此代码段添加到该文件中

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

有没有办法自动执行此路由选择?

希望我的问题对您很清楚。

1 个答案:

答案 0 :(得分: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))