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



我正在尝试使用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查找。效果很好!

相关内容

最新更新