[英]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();
});
};
掃描特定版本子目錄中的資源控制器並創建以下路由的中間件:
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.