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に投稿できます。
プライベートで構文エラーについて書いてください。


Source: https://habr.com/ru/post/J252971/


All Articles