スクリプトの場所がわかっている場合、つまり のような初期ディレクトリがある場合は、次のDIR
ように を操作できますfs
。
サーバー.js
var fs = require('fs');
var path_module = require('path');
var module_holder = {};
function LoadModules(path) {
fs.lstat(path, function(err, stat) {
if (stat.isDirectory()) {
// we have a directory: do a tree walk
fs.readdir(path, function(err, files) {
var f, l = files.length;
for (var i = 0; i < l; i++) {
f = path_module.join(path, files[i]);
LoadModules(f);
}
});
} else {
// we have a file: load it
require(path)(module_holder);
}
});
}
var DIR = path_module.join(__dirname, 'lib', 'api');
LoadModules(DIR);
exports.module_holder = module_holder;
// the usual server stuff goes here
ここで、スクリプトは次の構造に従う必要があります (require(path)(module_holder)
行のため)。たとえば、次のようになります。
user_getDetails.js
function handler(req, res) {
console.log('Entered my cool script!');
}
module.exports = function(module_holder) {
// the key in this dictionary can be whatever you want
// just make sure it won't override other modules
module_holder['user_getDetails'] = handler;
};
そして今、リクエストを処理するときは、次のことを行います。
// request is supposed to fire user_getDetails script
module_holder['user_getDetails'](req, res);
これにより、すべてのモジュールがmodule_holder
変数にロードされます。私はそれをテストしませんでしたが、動作するはずです (エラー処理を除く!!! )。この機能を変更したくなるかもしれませんが (例えばmodule_holder
、1 レベルの辞書ではなく、ツリーを作成するなど)、アイデアは理解できると思います。
この関数は、サーバーの起動ごとに1回ロードする必要があります(より頻繁に起動する必要がある場合は、おそらく動的なサーバー側のスクリプトを扱っているため、これはばかげたアイデアです)。ここで必要なのは、オブジェクトをエクスポートmodule_holder
して、すべてのビュー ハンドラーが使用できるようにすることだけです。