Nodejsに基づくモジュラーシステムの構築

基本的な要件



•モジュールの接続が簡単

•標準のURL構造

•多言語主義

•自動変更の受け入れ

•マルチプロセッサシステムの機能を使用する

システムはExpressに基づいています。 wait.forモジュールは、コードの記述を容易にするために使用されます



ファイル構造





Linuxサーバーのデモ



このプロジェクトでは、 foreverモジュールが使用されました。

-w-サーバーを直接再起動せずにモジュールを変更できます。 永遠に変更を監視し、必要に応じてサーバーに過負荷をかけます。

-lは、2つのログが多すぎると判断されたため、無効になります。

forever start -a -w -l /dev/null -o out.log -e err.log Server.js
      
      





マルチプロセッサシステムの機能を使用する



「クラスター」モジュールを介して複数のプロセスを起動して、コア間で負荷を分散します。

 // Server.js var cluster = require('cluster'); var workerCount = require('os').cpus().length; cluster.setupMaster({ exec: "app.js" }); // Fork workers. for (var i = 0; i < workerCount ; i++)cluster.fork()
      
      





モジュール接続



モジュールを簡単に接続するには、2つのスイッチを使用します。

すべてのルートを自動的に接続する


 // part of app.js //   routes    var routesPath = path.join(__dirname, 'routes'); //     var routeList = fs.readdirSync(routesPath); for(var i in routeList){ var filePath = path.join(routesPath,routeList[i]); if(fs.statSync(filePath).isFile() && path.extname(routeList[i])=='.js') require(filePath)(app); //   }
      
      





モジュール接続と関数呼び出し


ルートは個別に定義されます。 各ファイルでは、最終開発者のルートの統一と接続の容易さもどのように達成されます。

 // api.js module.exports = function (app) { app.get('/api/:mod/:lang/:action', function(req, res){action(req,res,global.conf.METHODS.GET);}); app.post('/api/:mod/:lang/:action', function(req, res){action(req,res,global.conf.METHODS.POST);}); app.delete('/api/:mod/:lang/:action', function(req, res){action(req,res,global.conf.METHODS.DELETE);}); app.put('/api/:mod/:lang/:action', function(req, res){action(req,res,global.conf.METHODS.PUT);}); }; function action(req, res, method) { //  var lang = req.params.lang.toUpperCase(); if (global.conf.AVAILABLE_LANGUAGES.indexOf(lang) > -1) { //    var mod = req.params.mod.replace(/[^a-zA-z0-9]+/g,''); //    var action = req.params.action.replace(/[^a-zA-z0-9]+/g,''); //    fs.exists(path.resolve(__dirname, './mod_api/'+mod+".js"),function(ok){ if(ok){ //   var startMode = require('./mod_api/'+mod); try{ //     pub_ wait.launchFiber(startMode['pub_'+action], req, res, lang, method); }catch(err){ res.status(405).pj(405,err.message,"Method Not Allowed"); } }else{ res.status(503).pj(503,null,'Service Unavailable '); } }); } else{ res.status(400).pj(400,null,'Not supported language'); } }
      
      





最終機能の実装



pub_というプレフィックスを持つすべての関数はパブリックであり、他のすべてはプライベートです。

 // file routes/mod_api/test.js exports.pub_Start = function(req, res, lang, method){ res.pj(0,(method===global.conf.METHODS.POST)?"POST":"GET","SUCCESS "); }
      
      





出力統合



 //part app.js http.ServerResponse.prototype.pj = function(status,data,message){ try { this.json({STATUS:status,CONTENT:data,MESSAGE:message}); }catch(e) { console.error(e); this.json({STATUS:999,CONTENT:null,MESSAGE:'parse response error'});} };
      
      







さて、関数呼び出しの最後に: api.codevit.net/api/test/en/Start

(サーバーがクラッシュしないことを本当に望んでいます。これは私のテストサーバーです)



興味がある人は、スケルトンをgithubに投稿できます。

プライベートで構文エラーについて書いてください。



All Articles