簡體   English   中英

ExpressJS RESTapi動態設置路由

[英]ExpressJS RESTapi dynamically set routes

我有一個expressJS RESTapi項目。 我的文件夾結構是這樣的。

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

在我的路線文件夾中

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

banner.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

有沒有辦法自動執行此路由操作?

希望我的問題對您清楚。

假設您遵循某些命名約定,則可能需要所有文件並實例化所有路由。 對於您的特定情況, <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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM