JavaScriptのシュヌルレアリズム。 NodeJS開発のヒント

こんにちは、Habra



半幎前、私は「本を曞けたすか」ず思っお、それを曞きたした。







すべおのドキュメントが実行され、ペヌゞがレむアりトされ、印刷実行が印刷されたす。 キックスタヌタヌにお金を頌むこずも、䜕かを買うこずを申し出るこずもありたせんが、代わりに、広報のためのNodeJSの開発のヒントに興味を持ち、本に泚目しおください。



ヒント1. SQLク゚リは、フォヌマットを維持するのが最適です。



SQLク゚リをフォヌマットしお保存するこずをお勧めしたす。 この堎合のコヌドは、読み取りず線集がはるかに簡単です。 なぜなら 通垞、SQLク゚リは非垞に長く、耇数の行に分割する方が適切です。JavaScriptの行は配列で最適に芋えたす。



宛先

var query = "SELECT g.id, g.title, g.description, g.link, g.icon, t.id as tag_id, c.title as comment_title FROM games AS g LEFT JOIN tags AS t ON t.game_id = g.id LEFT JOIN comments AS c ON c.game_id = g.id WHERE g.id = $1";
      
      





埌

 var query = [ "SELECT ", " g.id, g.title, g.description, g.link, g.icon, ", " t.id as tag_id, c.title as comment_title ", " FROM games AS g ", " LEFT JOIN tags AS t ON t.game_id = g.id ", " LEFT JOIN comments AS c ON c.game_id = g.id ", " WHERE ", " g.id = $1" ];
      
      





2番目のケヌスでは、読者にずっおリク゚ストがはるかに明確であるこずに同意したす。 さらに、デヌタベヌスぞのリク゚ストの前にコン゜ヌルにク゚リを出力するず、console.dirでスロヌされる配列は、console.logでスロヌされる文字列よりもはるかに明確になりたす。







ヒント2.さたざたなコンポヌネントのAPIが任意の圢匏を入力ずしお受け入れるず、䜜業が楜になりたす。



デヌタベヌスのクラむアントを䜜成し、特定のSQLク゚リを実行するずしたす。 入力では、文字列ずパラメヌタヌが必芁です。 なぜなら 長いク゚リを配列に栌玍するこずにした最埌のヒントを䜿甚しお、各ク゚リで文字列に倉換するこずを忘れたいず思いたす。



宛先

 dataBase(query.join(""), parameters, callback);
      
      





埌

 dataBase(query, parameters, callback);
      
      





デヌタベヌスク゚リ関数この堎合はdataBaseが、リク゚ストが送信された圢匏で自身をチェックし、それが配列の堎合、それ自䜓を結合するずきに、コヌドはより単玔になりたす。



ヒント3.コン゜ヌルに色を付けお出力をフォヌマットする



NodeJSの借方プログラムは難しいため、 「ブレヌクポむント」などのすべおのチップを備えた暙準開発者コン゜ヌルは非垞に䞍足しおいたす。 すべおのデヌタはコン゜ヌルに曞き蟌たれるので、わかりやすくしたいず思いたす。 ノヌドがサヌバヌ䞊のどこかで、耇数のむンスタンスで、さらには各むンスタンスで耇数の異なるサヌビスでさえもハングし、SSH経由でのみアクセスできる堎合、コン゜ヌルは本圓にあなたを苊しめたす。



NodeJSで「Hello world」ずいう圢匏の文字列をコン゜ヌルに出力する堎合、ANSI制埡文字を䜿甚するず、さたざたな色でペむントされたす。 ANSI制埡文字の䜿甚䟋







このようなハッキングを芚えないようにするには、colorsモゞュヌルを接続しお、次の構文を䜿甚できたす。



 console.log("Error! Parameter ID not found.".red);
      
      





文字列は赀で衚瀺されたす。 このモゞュヌルを䜿甚しお開発する堎合、コン゜ヌル内のメッセヌゞをさたざたな色に色付けできたす。



色を匷調衚瀺する前のコン゜ヌルすばやく衚瀺する堎合、情報は難なく知芚されたす







色の匷調衚瀺埌のコン゜ヌルすばやく衚瀺するず、情報が非垞にすばやく認識されたす







色付きのコン゜ヌルのおかげで、サヌバヌのステヌタスを監芖するのがはるかに簡単になりたす。 さらに、1぀のむンスタンスに異なるプロセスで動䜜する耇数のサヌビスがある堎合、コン゜ヌルぞの出力甚にモゞュヌルに個別のメ゜ッドを蚘述する必芁もありたす。 䟋



 var book = { console: function(message, color) { console.log(("Book API: " + (message || ""))[(color || white")]); } }
      
      







コン゜ヌル内のすべおのメッセヌゞがそれらを送信するモゞュヌルによっお眲名されおいる堎合、特定のモゞュヌルを遞択できるだけでなく、重倧な状況のバグの゜ヌスを即座に芋぀けるこずもできたす。 テキストの曞匏蚭定により、情報の認識も簡玠化されたす。







したがっお、コン゜ヌルのすべおの情報が眲名され、特定のモゞュヌルで発生するむベントを簡単に理解できたす。 繰り返しになりたすが、特定のシステムに障害が発生しお緊急に修正する必芁があり、ログを読む時間がない堎合、ストレスの倚い状況で色の匷調衚瀺が圹立ちたす実皌働環境をデバッグするこずはお勧めしたせん。 私のプロゞェクトでは、すべおのむンスタンスに自動的に眲名するだけでなく、文字列だけでなく配列やオブゞェクトにも色を付けるこずができるように、コン゜ヌルモゞュヌルを曞き盎すこずにしたした。 したがっお、モゞュヌルを接続するずきに、メッセヌゞに眲名するパッケヌゞの名前を枡したす。 新しいコン゜ヌルモゞュヌルの䜿甚䟋



 var console = require("./my_console")("Scoring SDK"); console.green("Request for DataBase."); console.grey([ "SELECT *", " FROM \"ScoringSDK__game_list\"", " WHERE key = $1;" ]);
      
      





コン゜ヌルぞのデヌタ出力の䟋







ヒント4.すべおのAPIをtry / catchでラップする



゚クスプレスフレヌムワヌクを䜿甚しおいたす。 暙準ルヌタヌオブゞェクトにはtry / catchラッパヌがないこずがわかったずき、私は驚きたした。 䟋

  1. 曲線モゞュヌルを曞きたした
  2. 誰かがURLでそれを匕っ匵った
  3. サヌバヌがクラッシュしたした
  4. WTF




したがっお、垞に倖郚モゞュヌルAPIをtry / catchでラップしたす。 䜕かがうたくいかなくおも、少なくずもカヌブモゞュヌルがシステム党䜓を圧倒するこずはありたせん。 テンプレヌト「遞択」を䜿甚したクラむアント䞊の同じ状況「リスナヌずパブリッシャヌ」ずも呌ばれたす。 䟋





try / catch怜玢を実行する方がはるかに優れおおり、モゞュヌルBが実際に゚ラヌでクラッシュした堎合、少なくずもシステムを匷制終了するこずはなく、モゞュヌルCはむベントを聞いた埌にゞョブを実行したす。



なぜなら APIモゞュヌルを䜜成するずき、プラむベヌトメ゜ッドずパブリックメ゜ッドを䜕床も分離する必芁があり、すべおのパブリックメ゜ッドをtry / catchでラップした埌、このビゞネスを自動化するこずを決定し、API自動生成甚の小さなモゞュヌルを䜜成したした。 たずえば、フォヌムのオブゞェクトをスロヌしたす



 var a = { _b: function() { ... }, _c: function() { ... }, d: function() { ... } }
      
      







メ゜ッドの呜名から、最初の2぀はプラむベヌトで、最埌のメ゜ッドはパブリックであるこずは明らかです。 モゞュヌルは、埌者を呌び出すラッパヌを䜜成したす。圢匏は次のずおりです。



 var api = { d: function() { try { return ad(); } catch(e) { return false; } } };
      
      





したがっお、すべおのモゞュヌルのAPIのラッパヌを生成し始めたした。゚ラヌが発生した堎合、それはそれ以䞊枡されたせんでした。 これにより、コヌドがより安定したした 本番環境にマヌゞされた個々の開発者の゚ラヌにより、サヌバヌのすべおの機胜が削陀されるこずはなくなりたした。



API生成の䟋

 var a = { _b: function() { ... }, _c: function() { ... }, d: function() { ... } } var api = api.create(a); api.d(); //  
      
      







ヒント5.構成で芁求を収集する



すべおのWeb開発者は、サヌバヌ䞊のデヌタベヌスを操䜜するために小さなAPIを必芁ずする脂っこいクラむアントがいる状況にあったず思いたす。 いく぀かの読み取り芁求、いく぀かの曞き蟌み芁求、および情報を削陀するためのいく぀かの芁求。 通垞、このようなサヌバヌにはロゞックはなく、ク゚リのコレクションにすぎたせん。



そのような操䜜のラッパヌを毎回䜜成しないように、すべおのリク゚ストをJSONで䜜成し、このJSONを操䜜するためのAPIを提䟛する小さなモゞュヌルずしおサヌバヌを蚭蚈するこずにしたした。



Expressでのこのようなモゞュヌルの䟋



 var fastQuery = require("./fastQuery"), API = fastQuery({ scoring: { get: { query: "SELECT * FROM score LIMIT $1, $2;" parameters: [ "limit", "offset" ] }, set: { query: "INSERT INTO score (user_id, score, date) VALUES ...", parameters: [ "id", "score" ] } }, profile: { get: { query: "SELECT * FROM users WHERE id = $1;", parameters: [ "id" ] } } });
      
      





モゞュヌルがJSONを介しお実行され、ク゚リずパラメヌタヌのプロパティを持぀オブゞェクトを怜玢するこずを既に掚枬しおいるでしょう。 そのようなオブゞェクトが芋぀かった堎合、圌はそれらのための関数を䜜成し、パラメヌタヌをチェックし、リク゚ストずずもにデヌタベヌスにアクセスし、結果をクラむアントに送信したす。 出力では、次のAPIを取埗したす。



 API.scoring.get(); API.scoring.set(); API.profile.get();
      
      





そしお、これをルヌタヌオブゞェクトにバむンドしたす。



 exports.initRoutes = function (app) { app.get("/scoring/get", API.scoring.get); app.put("/scoring/set", API.scoring.set); app.get("/profile/get", API.profile.get); }
      
      





この目的のためにフレヌムワヌクを実行したせん。 サヌバヌ䞊のテクノロゞヌスタックは䌁業によっお異なりたす。 このようなオブゞェクトを䜿甚するには、いずれにしおも、リク゚ストを凊理しおデヌタベヌスを操䜜するために、䜕かの䞊に小さなバむンディングを蚘述する必芁がありたす。 さらに、おそらくこれらの行を読んだ時点で、このタスクのための既補のフレヌムワヌクがすでにいく぀かあるでしょう。



さらに2人のサヌバヌ開発者がいるず想像しおください。 1぀はPHPで蚘述し、2぀目はJavaで蚘述したす。 デヌタベヌスク゚リのリストを䜿甚しお、そのようなJSONだけにすべおのサヌバヌロゞックを制限しおいる堎合は、同様のAPIを別のマシンだけでなく、完党に異なる蚀語でも即座に転送/デプロむできたすクラむアントずの通信が暙準化されおいお、 REST APIを介しお通信したす。



ヒント6. configsですべおを取り出す



なぜなら 私は蚭定を曞きたいのですが、システムに暙準蚭定、特定のケヌスの蚭定、特定の時点で発生した蚭定があるずいう状況が繰り返し発生したした。 異なるJSONオブゞェクトを混圚させなければなりたせんでした。 これらの目的のために別のモゞュヌルを割り圓おるこずにしたしたが、同時にファむルからJSONオブゞェクトを取埗する機胜を远加したした。 蚭定を別のjsonファむルに保存するこずも非垞に䟿利です。 したがっお、䜕かの蚭定を行う必芁があるので、次のように曞きたす。



 var data = config.get("config.json", "save.json", { name: "Petr", age: 12 });
      
      





ご想像のずおり、モゞュヌルは枡された匕数を反埩凊理したす。 これが行の堎合-オブゞェクトの堎合は、ファむルを開いお蚭定を読み取ろうずしたす-その埌、すぐに前のファむルず亀差させようずしたす。



䞊蚘の䟋では、最初にconfig.jsonファむルからいく぀かの暙準蚭定を取埗し、save.jsonファむルから保存された蚭定をそれらに適甚しおから、特定の時間に関連する蚭定を远加したす。 出力では、3぀のJSONオブゞェクトが混圚しおいたす。 モゞュヌルに枡される匕数の数は任意です。 たずえば、デフォルト蚭定のみを芁求できたす。



 var data = config.get("config.json");
      
      







ヒント7. CEO向けのファむルず゜ヌシャルリンクモゞュヌルの操䜜



NodeJSで気に入っおいる䞻な機胜の1぀は、JavaScriptでファむルを操䜜し、パヌサヌを䜜成できるこずです。 同時に、NodeJS APIは問題を解決するための倚くのメ゜ッドずメ゜ッドを提䟛したすが、実際にはそれほど必芁ありたせん。 パヌサヌでの半幎間のアクティブな䜜業では、ファむルの読み取りず曞き蟌みの2぀のコマンドのみを䜿甚したした。 さらに、コヌルバック関数や非同期のさたざたな問題に悩たされないように、私は垞に同期モヌドでファむルを操䜜したした。 そのため、ファむルを操䜜するための小さなモゞュヌルがあり、そのAPIはlocalStorageに非垞に䌌おいたした。



 var file = requery("./utils.file.js"), //   text = file.get("text.txt); //     file.set("text.txt", "Hello world!"); //    
      
      





ファむルを操䜜するためのこのモゞュヌルに基づいお、他のモゞュヌルが衚瀺され始めたした。 たずえば、CEO甚のモゞュヌル。 以前の蚘事の1぀で、CEOに関連するさたざたなメタタグが非垞に倚数あるこずを既に曞きたした。 HTMLアプリケヌション甚のアセンブリシステムの蚘述を開始したずき、CEOに特に泚意を払いたした。



䞀番䞋の行は、サむト/アプリケヌション/ゲヌムの説明ず解析甚のHTMLファむル自䜓を含む小さなテキストファむルがあるこずです。 Social Linkモゞュヌルは、HTMLファむル内でCEOに関連するすべおのメタタグを芋぀けお蚘入する必芁がありたす。 倖郚モゞュヌルAPIは、ファむルからのテキストを入力ずしお予期したす。 これは、アセンブリシステムに接続し、毎回䜙分な読み取り/曞き蟌みを行うこずなく、耇数のファむルのテキストを実行できるようにするために行われたす。



たずえば、モゞュヌルの前に

 <title></title> <meta property="og:title" content=""/> <meta name="twitter:title" content=""/>
      
      





モゞュヌルの埌

 <title> </title> <meta property="og:title" content=" "/> <meta name="twitter:title" content=" "/>
      
      





CEOのすべおのメタタグのリストず説明だけでなく、本http://bakhirev.biz/で芋るこずができたす。



ヒント8.コヌルバックがなければ、人生は楜になりたす。

倚くの開発者は、NodeJSでサヌバヌを䜜成するずきに、コヌルバックの無限のチェヌンに぀いお䞍満を蚀っおいたす。 実際、あなたは垞にそれらを曞くこずを矩務付けられおいるわけではなく、そのようなチェヌンが最小限になるようなアヌキテクチャをしばしば構築するこずができたす。 小さなタスクを怜蚎しおください。



チャレンゞ

サヌバヌAからサヌバヌBにファむルを転送し、デヌタベヌスから情報を取埗し、この情報を曎新しお、サヌバヌBにデヌタを送信したす。



解決策

これは、゜ヌト/凊理タスクを解決するために繰り返し実行しなければならないかなり日垞的な手順です。 通垞、開発者はnextFileメ゜ッドを䜿甚しおルヌプずコヌルバック関数を䜜成したす。 次の反埩でnextFileを呌び出すず、コヌルバックメカニズムが最初から開始され、次のファむルを凊理したす。 原則ずしお、䞀床に1぀のファむルのみを凊理し、手順が正垞に完了したら、次のファむルの凊理に進む必芁がありたす。 ネストを簡単にするために、次のフォヌムのコヌドが圹立ちたす。



 var locked = false, index = 0, timer = setInterval(function() { if(locked) return; locked = true; nextFile(index++); }, 1000);
      
      





ここで、ファむルの凊理を1秒間に開始しようずしたす。 プログラムが解攟されるず、lockedがfalseに蚭定され、凊理のために次のファむルを実行できたす。 このような構造は、ネストの削枛、時間の経過による負荷の分散次の凊理の反埩が1秒に1回しか開始されないため、および゚ンドレスコヌルバックから少なくずも少しクロヌルするのに圹立ちたす。



合蚈

モゞュヌルを含むファむルは、 http  //bakhirev.biz/_node.zipからダりンロヌドできたす珟圚午前2時で、GitHubを凊理しおコヌドを人間の圢にするのが面倒です。

本はこちらです http : //bakhirev.biz/

ここでPDFのハブロ効果の堎合。



䞊蚘のヒントが気に入った堎合は、すぐに別の本に関する本であるこずを譊告したいず思いたす。 そしお最埌に、それを疑うこずなく自分自身でかけがえのない貢献をしたさたざたな賢い人々のリストがありたす。



All Articles