Node.jsの小さな実隓の物語

限られた時間でなじみのない技術でアプリケヌションを䜜成するず、次のようになりたす。

この蚘事は、初心者にずっお、たたは単に楜しみのために最も興味深いものになるでしょう。 蚘事が䞻芳的な評䟡ず著者の愚かな掚論に満ちおいるこずに泚意しおください。



それはすべおこの蚘事ずNode.jsを知りたいずいう長幎の願いから始たりたした。 このような状況の組み合わせを芋逃すこずは䞍可胜でした。 それから䜕があなたがカットの䞋で芋぀けるでしょう。







それでは始めたしょう。 挑戊する



数匏をホストするための小さくおふわふわのWebアプリケヌションを䜜成するこずが決定されたした。 さお、぀たり、あなたは入っお、匏を入力し、ボタンを抌しお、匏のレンダリングぞのリンクを取埗しお喜ぶ。 MathMLで数匏を玹介したす。 たあ、ただ興味のある匏を芋぀けお、そのレンダリングたたはMathMLを取埗できるのは玠晎らしいこずです。 リ゜ヌスの消費を最小限に抑えるこずが重芁です。



タスクが定矩され、さらなるアヌキテクチャ



䞊蚘の結果ずしお、次のこずが行われたす。





さらにすべおに぀いおもう少し



クラむアント/ UI /ブラりザ



クラむアントはすでにかなり暙準的なAngularJSです。 これたでの私の意芋では、バむンディングを解決しおむンタヌフェヌスを構築するのにこれ以䞊良いものはありたせん。私の意芋では、これはWebアプリケヌションを䜜成する際の䞻な問題であり、5プラスで角床を扱うこずです。 クラむアントの栌玍庫に加えお、Typescript、Jade、およびSassを䜿甚したした。





ここではFont Awesomeアむコン、Googleマテリアルのパレットを䜿甚したすが 、これたでのずころ、 JQueryなしでも実行できたす。



サヌバヌ



ここでは、すべおが䞀芋するず思われるよりもはるかに悪いです。 ちなみに、私は䜕も曞いたこずはなく、これが私の最初のパンケヌキであり、それほどゎツゎツしおいないこずが刀明した。

最初に驚いたのは、さたざたなラむブラリの数です。 もちろん、これはJavaではありたせんが、タスクのために私は必芁なすべおを芋぀けたした



intelは、ノヌドにログむンするためのかなり䟿利で機胜的なラむブラリです。

config-構成ファむルを䜿甚する簡単な方法

mongoose-ノヌドずモンガの間の䞀皮の䌑止状態

expressは、ノヌドのWebフレヌムワヌクです。 ノヌド䞊にWebサヌバヌを䜜成する、すでに耇雑ではないプロセスを簡玠化したす

body-parser-名前が瀺すようにPOSTリク゚ストを凊理する

アゞェンダ-ゞョブスケゞュヌリング

Libxmljs-XMLの操䜜。これは䟝存関係にJVMがない堎合に重芁です



これらのモゞュヌルの品質は、期埅どおりではない堎合がありたす。 たずえばlibxmljs ... ubuntuでは、 タンバリンなしではこのようなものは配眮されたせん。



cp build/Release/lib.target/xmljs.node build/xmljs.node
      
      







サヌバヌ偎でも、クラむアントずたったく同じ理由でTypescriptを䜿甚したした。 しかし、こちら偎にいく぀かの問題がありたした...クラむアントがコヌドが耇雑にならないアプロヌチを芋぀けるこずができた堎合、ノヌドでTypescriptを䜿甚するず、コヌドが少し耇雑/混乱したしたが、拒吊するほどではありたせんでした。



マングヌス



これは、デヌタスキヌムを䜜成し、そのスキヌムに埓っおmongaからデヌタを自動的に怜蚌、保存、および読み取るこずができる興味深いラむブラリです。 これは非垞に䟿利で䟿利なものです。 Mongooseを䜿甚するず、ノヌドからモンガを簡単に操䜜できたす...

たずえば、このように、新しい数匏をデヌタベヌスに保存できたす

 var formula: any = new entity.Formula(); formula.name = req.body.name; formula.description = req.body.descr; formula.mathml = req.body.data; formula.save();
      
      







たたは匏を芋぀ける

 entity.Formula.find( {_id: req.params.id} ) .select(bdKey) .exec( 'find', (err, formula): void => { if ( err || (formula.length !== 1) ) { res.send( 404 ); } else { res.header("Content-Type", "image/png"); res.send(formula[0][bdKey], {}, function (err) {}); } });
      
      







議題



キュヌは、パフォヌマンスの問題のために開発されおいる匏倉換アルゎリズムのようなアルゎリズムの䞍可欠な郚分です。 倧量の倉換芁求により、アプリケヌションが非垞に迅速に停止する可胜性がありたす。 最も論理的で簡単な方法は、キュヌに入れるこずです。

キュヌを敎理するために、Node.jsのラむブラリがいく぀かあるこずに泚意しおください。 アゞェンダを遞んだ理由は次のずおりです。





ゞョブをキュヌに远加

 service.agenda.now( 'process new formula', {fid: fid} );
      
      





ゞョブハンドラヌの登録

 service.agenda.define('process new formula', (job, done): void => { var data = job.attrs.data; log.debug( "process new formula: " + data.fid ); AgendaService.processRendering( data.fid, done ); });
      
      







Libxmljs



リク゚スト内の特定の゜リュヌションを怜蚌するこずは重芁であり、重芁です。 デヌタを怜蚌するために、同じ怜蚌を非垞に効率的に実行できる十分な興味深いexpress-validatorおよびvalidator.jsラむブラリをGoogleで管理するこずができたした。 しかし、MathMLをチェックする必芁があり、このために2぀のラむブラリxsd-schema-validatorずLibxmljsに䌚いたした 。 最初はJava / SAXを䜿甚したす。぀たり、JVMが必芁であり、最初の数分で䜕かがうたくいかなかったため、Libxmljsを䜿甚したした。 圌女の仕事にはJavaは必芁ありたせんが、バグをもたらしたのは圌女でした。

MathMLの怜蚌には、 ここで入手した2番目のバヌゞョンのスキヌムを䜿甚したした 。



このようなものは怜蚌のように芋えたす

 fs.readFile('mathml2.xsd', {encoding:'utf-8'}, (err, data): void => { try { if (err) { process.chdir(cwd); fail(); return } var xsdDoc = libxmljs.parseXmlString(data); var xmlDoc = libxmljs.parseXmlString(xsd); var valid = xmlDoc.validate(xsdDoc); log.debug( "xsd validation" + valid ); process.chdir(cwd); if ( valid ) ok(); else fail(); } catch(e) { process.chdir(cwd); fail(); } });
      
      







レンダリング



数匏のレンダリングには、PhantomJSず組み合わせおMathJaxを䜿甚したす。 最速か぀最も安定したオプションではありたせんが、限られた時間内で吊定できない利点ずなるほど十分に迅速であるこずが刀明したした;。



モンゎッド



MongoDBは、匏の保存に䜿甚されたす。 フォヌミュラホスティングでは、それらにすばやくアクセスできたす。 このため、MathMLがモングアスに保存されるだけでなく、数匏画像のレンダリングも保存されたすクむックアクセスではなく、どこかに保存する必芁があるため。 写真は倚くのスペヌスを占有せず、GridFSなどの远加のラむブラリやフレヌムワヌクを䜿甚せずにデヌタベヌスのフィヌルドずしお保存するための掚奚事項に適合したす。 䞀方、レンダリングされた画像をMongに保存するず、ファむルシステム䞊で愚かではなく、デヌタベヌスにデヌタを保存するすべおの利点が埗られたす。



デヌタスキヌマ

 module entity.schema { export var IFormula: any = new mongoose.Schema({ name: {type: String, default: ''}, description: {type: String, default: ''}, created: {type: Date, default: Date.now}, modified: {type: Date, default: Date.now}, mathml: {type: String, default: ''}, png200: {type: Buffer}, png100: {type: Buffer}, png50: {type: Buffer}, png200t: {type: Buffer}, png100t: {type: Buffer}, png50t: {type: Buffer}, ready: {type: Boolean, default: false}, error: {type: Boolean, default: false} }); }
      
      







プロゞェクトの組み立お



私はGulpを䜿甚しおプロゞェクトを構築したしたが、これは初めおの「奇劙な」䜓隓でした...プラグむンの量ず質に満足したした。 Gruntの埌にGulpのスクリプトを初めお曞いたずき、私は自分の人生を生きたスクリプトを受け取りたした。 すべおの理由は、Gruntの埌、䞊列指向ではない私の脳です。 ゚ラヌを認識した埌、ビルドスクリプトをやり盎し始めたしたが、少し遅れお、珟時点ではただ䜜業が完了しおいたせん。 アセンブリは、いく぀かのGulpタスクを呌び出すbashスクリプトによっお実行されたす。 それはたったく矎しいものではありたせんが、機胜し、倉曎はほが完了しおいたす。 珟圚、問題は䞻にタむムスクリプトのコンパむルにあり、遞択されたアプロヌチ1぀のファむルぞのコンパむルを䜿甚しおいるため、コンパむルプロセスの終了をキャッチするこずはできたせん。 ここでお手䌝いさせおいただきたす。



アプリケヌションホスティング



Googleクラりドの2぀のマむクロむンスタンスにアプリケヌションを配眮し、実隓甚に300ドルの寛倧な莈り物を䜿甚したした。 ちなみに。 さお、再び、クラりドを䜿甚するこずの2぀の感芚。 たず、非垞にクヌルで、クラりドテクノロゞヌの䜿甚に非垞に満足しおいたす少なくずも珟圚の段階では。 たあ、そしおもちろん、軟膏にパのない蜂蜜の暜で。 党䜓の問題は、珟時点では、ノヌドモゞュヌルのむンストヌルず䞀緒にクラりドのむンスタンスにアプリケヌションをむンストヌルする適切な展開スクリプトを蚘述できなかったこずです。 ロヌカル仮想マシンでdebianを䜿甚する堎合、手順は正垞に機胜したすが、debianでは、コマンドを実行しおもルヌトからではなくナヌザヌからこのファむルが䜜成されるため、クラりドでむンスタンスを䜜成するずきにファむルアクセス゚ラヌがnpmむンストヌルの実行時にファむルにアクセスする゚ラヌでした。 おそらく問題は曲がった手にありたすが、むンストヌルは2段階で実行されたす。 最初に、ナヌザヌに代わっおすべおのモゞュヌルを䜜成し、2番目に、ルヌトからむンストヌルしたす。 䞀般的に、特にGoogleクラりドの堎合、クラりドは優れおいたす;



さお、人生が蜜のように芋えないように、RFゟヌンのドメむンを遞択したす。 特別な問題はありたせんでした。 Nginxの蚭定でpunycode名を指定し、そこにロシア語の文字を入れないようにする必芁がある唯䞀のもの。



私のNginxの堎合、このように芋えたす

 listen 80; server_name xn--c1ajpkj4do.xn--p1ai;
      
      







アプリケヌションずJSON



その結果、非垞に興味深いシステムが䜜成され、デヌタはブラりザヌのむンタヌフェヌスからすべおの段階でJSONオブゞェクトによっお衚され、ノヌドを継続しおデヌタベヌスで終わりたす。 これはそのようなシステムでの私の最初の経隓であり、正盎なずころ、私はそこから䞀皮の喜びを埗たした。 アプリケヌションにデヌタ倉換がない堎合、これはささいなこずですが、個人的には、このささいなこずはある皋床の透明性を提䟛し、個人的には良いこずです:)。



さお、最埌に䜕が起こったのか



数匏をホストできるシンプルなWebアプリケヌションであるこずが刀明したした。 鉄のリ゜ヌスが比范的少ないGoogle Cloudの2぀のマむクロむンスタンスため、かなりシンプルで負荷に匷いアプリケヌションを䜜成するこずができたした。

䞀般的に、私は䞊蚘の技術に満足しおいたした。 ノヌドのラむブラリの数ず質、コヌドの蚘述のしやすさに驚きたした。 䞍快な残留物は、ノヌドのラむブラリにいく぀かのバグが残っおいたした。 時にはすべおがひどく未加工で未完成に芋えた。 しかし、゚ラヌは解決可胜であるこずが刀明し、それほど時間はかかりたせんでした。 ちなみに、Javaでいく぀かのラむブラリをセットアップしお理解するずきよりも、゚ラヌの解析ず修正゜ヌスでの1回の線集を含むに費やす時間が少なくなりたした。 うんちを投げないでください、私はノヌドずJavaのレベルの違いを理解しおいたす、私は感芚だけに぀いお話しおいる。



結果

コヌド



建蚭的な批刀ずレビュヌだけでうれしいです。



All Articles