繁体   English   中英

使用Node.js中的fs模块自动发现脚本

[英]Automatic script discovery with fs module in Node.js

我正在尝试使用Node.js开发REST API。 我想将路由和特定的资源模块分开,以标准化资源的组织,并使用不同的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 / resource解析为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;
    };

尝试在路由路径中使用正则表达式:

app.get('/:var(v1|v2)/x/y',controller.function);

我找到了由Mohit Sahu提出的想法来做到这一点的最佳方法。基本上,我通过使用可以接受所有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();
    };

将该代码段用作我的快速应用程序实例的中间件。 现在没有fs查找。 效果很好!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM