Автоматическое обнаружение скрипта с помощью модуля fs в Node.js - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь разработать REST API с помощью Node.js. Я хочу разделить маршруты и конкретные ресурсные модули, стандартизировать организацию ресурсов, иметь разные версии API. Я также хочу избегать определения новых маршрутов каждый раз, когда я разрабатывал соответствующий ресурсный модуль. Поэтому я хочу, чтобы моя маршрутизация автоматически обнаруживала все мои скрипты в каталоге, где расположены все модули ресурсов. Я делаю это, используя модуль fs. Мой вопрос, однако, касается эффективности такого подхода. Каждый запрос к моему серверу будет включать в себя эти поиски файловой системы, и я не уверен, насколько плохо это повлияет на производительность. Есть ли лучший способ достичь того, чего я пытаюсь достичь?

Промежуточное программное обеспечение, которое обрабатывает различные подкаталоги версий API

    const versionRouter = (req, res, next) => {
      fs.readdir(__dirname, function(err, items) {
        console.log(items);
        for (var i = 0; i < items.length; i++) {
          if (items[i] != "index.js") {
            console.log(items[i]);
            let version = items[i];
            const express = require("express");
            let expressRouter = express.Router();
            expressRouter = controllerRouterMiddleware(expressRouter, version);
            app.use(uriPrefix + "/" + version, expressRouter);
          }
        }
        next();
      });
    };

Промежуточное программное обеспечение, которое сканирует контроллеры ресурсов в подкаталоге определенной версии и создает следующие маршруты:

  • GET / resource разрешается в методе controller.list
  • POST / ресурс разрешается в методе controller.create
  • GET / resource /: id преобразуется в метод controller.item
  • PUT / resource /: id преобразуется в метод controller.save
  • DELETE / resource /: id разрешается в метод controller.delete
    const controllerRouterMiddleware = (expressRouter, version) => {
      let items = fs.readdirSync(__dirname + "/" + version);
      console.log(__dirname + "/" + version);
      for (var i = 0; i < items.length; i++) {
        console.log(items[i]);
        const apiController = require("./" + version + "/" + items[i]);
        expressRouter
          .route("/" + items[i].slice(0, -3))
          .get(apiController.list)
          .post(apiController.create);

        expressRouter
          .route("/" + items[i].slice(0, -3) + "/:id")
          .get(apiController.item)
          .put(apiController.save)
          .delete(apiController.delete);
      }
      return expressRouter;
    };

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Я нашел лучший способ сделать это с идеей, предложенной Мохит Саху По сути, я создал общий маршрут с использованием параметров экспресс-маршрутизатора, который принимает все методы HTTP.Затем создал прокси-метод, который импортирует соответствующий контроллер и вызывает определенный метод в зависимости от параметров и метода запроса.

    const controllerProxy = (req, res, next) => {
      let v = req.params.v;
      let resource = req.params.resource;
      let operation = req.params.operation || undefined;

      const controller = require("./" + v + "/" + resource);
      if (req.method == "GET") {
        if (operation != undefined) {
          return controller.item(req, res, next);
        } else {
          return controller.list(req, res, next);
        }
      }
      if (req.method == "POST") {
        return controller.create(req, res, next);
      }
      if (req.method == "PUT" && operation != undefined) {
        return controller.save(req, res, next);
      }
      if (req.method == "DELETE" && operation != undefined) {
        return controller.delete(req, res, next);
      }
    };

    return (req, res, next) => {
      app.route(uriPrefix + "/:v/:resource/:operation?").all(controllerProxy);
      next();
    };

Использовал этот фрагмент кода в качестве промежуточного программного обеспечения для моего экземпляра приложения Express.Нет fs поиска сейчас.Работает на отлично!

0 голосов
/ 09 апреля 2019

попробуйте использовать регулярное выражение в пути маршрутизации:

app.get('/:var(v1|v2)/x/y',controller.function);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...