SailsJSで簡単なブログを曞く初心者向けのグッドプラクティス郚1

あらすじ



この蚘事は、NodeJS開発ぞの旅の初心者を察象ずしおおり、 SailsJSフレヌムワヌクを䜿甚しおこのプラットフォヌムで開発する初心者を玹介したす。 この蚘事では、このフレヌムワヌクを䜿甚する初期スキルを説明するこずを目的ずした簡単なブログの䜜成プロセスに぀いお説明したす。これは、NodeJSのプロゞェクトの優れた基盀です。 玠材のより良い同化のために、Javascriptプログラミング蚀語ずNodeJSのサヌバヌ実装の基本的な理解ず、 Sailの基瀎であるMVCスキヌムの少なくずも䞻芁なアむデアを持っおいるこずが望たしいです。 フレヌムワヌクをよりよく理解するには、Sailsの公匏Webサむトでドキュメントを読むこずができたす。たた、CailsでSailsを䜿甚する方法を十分に詳现に説明しおいたす。 蚘事を曞くずき、私はできるだけシンプルで明快な玠材を曞き蟌もうずしたしたが、この蚘事では経隓のあるナヌザヌには新しいこずは䌝えたせん。



䜜業環境の準備



たず、SailsJSフレヌムワヌク自䜓をむンストヌルしたす。最初は、NodeJSパッケヌゞが既にむンストヌルされおおり、むンタヌネットにアクセスできるものず想定されおいたす。 私の堎合、私のOSはFedora 20です。あなたの䞀郚はMac OS X、Ubuntu、その他のOSです。この䟋ではベヌタ版を䜿甚し、SailsJSをグロヌバルにむンストヌルするコマンドを入力したす

sudo npm install -g sails@beta
      
      





その埌、新しいプロゞェクトを䜜成する必芁がありたす-Sailsでは、これは簡単か぀明確に行われたす。

 sails new sails-blog --linker cd sails-blog/
      
      





説明したす-パラメヌタ
 new
      
      



新しいプロゞェクトを䜜成するタむトル、そしおプロゞェクトの名前、パラメヌタヌを入力したす
 --linker
      
      



プロゞェクトでフロント゚ンドのファむルが自動的に接続されるようにしたすjs、css、imagesなど、CoffeeScriptファむルずLESSファむルも自動的にコンパむルされたす。これも非垞に䟿利ですが、これに぀いおは埌で詳しく説明したす。 その埌、生成されたプロゞェクトがあるディレクトリに移動したす。



Bootstrapの接続-フロント゚ンドの構成を理解したす



Sailsでは、フロント゚ンドのホストを担圓する偎は非垞に䟿利に線成されおおり、サヌバヌはプロゞェクトのルヌトにある/ assetフォルダヌにあるすべおのファむルを翻蚳したす。 アセットフォルダヌのファむル自䜓にはほがこのアクセス暩がありたす。指で説明したす。特定のimage.png画像を配眮したい堎合は、 asset / images /ディレクトリに配眮したす。この堎合、サヌバヌの実行時に、このファむルはHost / images /image.png これは基本的な情報であり、 ブヌトストラップをむンストヌルし、LESSの゜ヌスずずもにアヌカむブをダりンロヌドしたすこのスタむル蚀語が倧奜きです。



アヌカむブからlessフォルダヌをasset / styles /にアンパックしたす -これにより、 assets / styles / lessフォルダヌの堎所になり、lessフォルダヌの名前をbootstrapに倉曎し䟿宜䞊、bootstrapの䞻芁郚分をアンパックした埌、このコピヌのグリフを接続する必芁がありたすアヌカむブからアセットのルヌトぞのフォントフォルダヌ玄/アセット/フォント。 お気に入りのSublime Textテキスト゚ディタヌで/assets/styles/importer.lessファむルを開きたす。このファむルはデフォルトでメむンテンプレヌトに接続され、Gruntによっお垞に監芖されおいたす-自動的にimporter.cssにコンパむルされたす

それぞれ、このファむルに行を远加しおブヌトストラップを台無しにしたす

 @import 'bootstrap/bootstrap';
      
      





同じimporter.lessでグリフを接続するには、グリフがフォントフォルダヌにあるため、グリフを含むフォルダヌぞのパスを瀺す倉数を宣蚀する必芁がありたす-ファむルに次の行を远加したす

 @icon-font-path: '/fonts/';
      
      





最終的にブヌトストラップをむンストヌルするには、jquery.jsおよびboostrap.jsファむルをasset / js / dependencies / folderにドロップするだけです。

これで、フロント゚ンドの構成ずSailsの静的に関する最初の知識を終了し、ブログ自䜓の開発に盎接進みたす。



Post APIを䜜成-モデル、コントロヌラヌの最初の知り合い



たず、モデルずコントロヌラヌで構成されるAPI耇合䜓を䜜成したす。これは明癜な理由でpostを呌び出したす; API耇合䜓を䜜成するには、次のコマンドを入力したす。



 sails generate api post
      
      





生成されたファむルは、 api /ディレクトリ内の同じ名前のフォルダヌに配眮されたす。Sailsは、デフォルトで操䜜可胜なCRUD APIを䜜成したす。詳现に぀いおは、Sailsを説明するビデオを参照しおください。

ここで、前に䜜成したPostモデルを開き、コヌドの蚘述を開始したす。モデルでは、属性名、そのタむプ、およびバリデヌタヌを指定する必芁がありたす。 次に、モデルの内容を説明したす。



API /モデル/ Post.js


 module.exports = { attributes: { title: { type: 'string', maxLength: 120, required: true }, description: { type: 'string', required: true }, content: { type: 'string', required: true } } };
      
      





モデルのコンポヌネントはJSONに非垞に類䌌しお構築されおいるため、 atributes構造内で理解できるように、非垞にわかりやすく䟿利です。モデルの属性をリストしたす。この堎合、タむトル、短い説明、コンテンツの3぀の属性が必芁です。 3぀のタむプすべおに文字列があり、ヘッダヌには2぀のバリデヌタヌがありたすmaxLength最倧文字列長、必須新しいレコヌドを䜜成するずきにこの属性が必芁かどうかこの堎合は必須、残りの2぀の属性にパラメヌタヌを蚭定したす。すべおの堎合のバリデヌタヌHEXカラヌバリデヌタヌを含むに぀いおは、こちらの党リストをご芧ください 。



そのため、デヌタベヌス内のレコヌドずその操䜜を担圓する最初のモデルをコンパむルしたした。 ここで、コントロヌラヌ-api / controllers / PostController.jsを䜿甚しおメむンアクションに進むこずができたす。



コントロヌラヌでの操䜜も䟿利なJSONプレれンテヌションで行われたす。最初に、ブログにできるこずをリストしたす。それに応じお、タスクをコントロヌラヌ芁玠に分割したす。 私たちのブログは、短い説明付きの投皿のリストを降順で衚瀺できるようにする必芁がありたす最初の新しい投皿、最埌の叀い投皿。 したがっお、私にずっおは、これらの機胜を3぀のコントロヌラヌ属性ず、レコヌド操䜜の3぀の䞻な機胜むンデックスに分割したした。最埌の10件の投皿を衚瀺したす。 参照特定のzapsiの完党なコンテンツを衚瀺したす。



ペヌゞネヌション-リストを分割し、リストの特定のスラむスでリストを衚瀺したす。 远加、曎新、削陀-曞き蟌み機胜でコヌドの䜜成を始めたしょう。 module.exportsの内郚-コヌドを蚘述したす。



公益事業


䜜成


 create: function (req, res) { var params = { description : req.param('description'), content : req.param('content'), title : req.param('title'), } Post.create(params).exec(function (err, post) { res.redirect('/post/watch/' + post.id); if (err) return res.send(500); }); }
      
      







このコヌドでは、理解できるように、デヌタベヌスでの新しいレコヌドの䜜成に぀いお説明したす.Sailsで述べたように、CRUD APIはデフォルトで組み蟌たれおいたす。぀たり、各URLサブコントロヌラヌはGETたたはPOSTを䜿甚しおパラメヌタヌを枡すこずができ、Sailsはすでにそれらを凊理できたす。

Post.create-1Postモデルを䜿甚し、createメ゜ッドが新しいレコヌドを䜜成するこずを意味したす。レコヌドの属性ずこの属性の倀を指定するリストを枡す必芁がありたす。この堎合、匕数は匕数を枡すこずで生成されたす。 CRUDを䜿甚する堎合、パラメヌタヌリストで送信するパラメヌタヌを指定したす。これを行う方法が分からない堎合は、指で説明したす。レコヌドを䜜成する堎合は、タむトルのパラメヌタヌを指定しおPOSTリク゚ストたずえば、Postman経由を送信したす。説明、コンテンツ-URL / P このURLで受け入れられるost / createパラメヌタヌは、req.param 'parameter'を䜿甚しお呌び出すこずができたす。 2execメ゜ッドでは、゚ラヌの䜜成䞭に発生した匕数ずしおerrを取る匿名関数を䜿甚し、䜜成したばかりのポストからのデヌタずしおポストしたす。゚ラヌが発生した堎合、ペヌゞ500を生成するようにさらに凊理したす。正垞に䜜成された投皿デヌタを受信したずき投皿の識別子をURLに枡しお、完党な説明このコントロヌラヌを以䞋で怜蚎したすでペヌゞにリダむレクトしたす。



次の補助サブコントロヌラヌは、デヌタ曎新サブコントロヌラヌを䜜成したす。これは、情報の線集が必芁な堎合に非垞に䟿利です。



曎新する


 update: function (req, res) { var Id = req.param('id'); var elem = { description : req.param('description'), content : req.param('content'), title : req.param('title') }; Post.update(Id, elem).exec(function (err) { if (err) return res.send(500); res.redirect('/'); }); }
      
      





この堎合、 曎新メ゜ッドは䜜成メ゜ッドず非垞に䌌おいたす-違いは、最初の匕数がレコヌドのIDを指定するこずです-前回ず同様に、枡されたパラメヌタヌから取埗したす。 このコヌドの本質は、私が思うに、あなたはすでにキャッチしたした。 最埌に行うナヌティリティは、レコヌドの削陀です。



削陀する


 delete: function (req, res) { var Id = req.param('id'); Post.destroy(Id).exec(function (err) { if (err) return res.send(500); res.redirect('/post'); }); }
      
      





レコヌドを削陀するには、 idを指定するだけです。



メむンパヌツ+ビュヌの操䜜


ここで、アプリケヌションのメむンの「フロント」郚分を䜜成するこずを怜蚎したす。この郚分は、䌝統的にむンデックスペヌゞから開始したす。倚くの堎合、むンデックスずしおペヌゞネヌションスラむスの1ペヌゞを割り圓おるこずができたすが、初心者は䜙分な郚分を噛む方が良いず思いたす回。 むンデックスもそうです。



 index: function (req, res) { Post.find() .sort('id DESC') .limit(5) .exec(function (err, posts) { if (err) return res.send(500); res.view({ posts: posts }); }); }
      
      







次に、コヌドの説明を開始したす。findメ゜ッドはモデル内のレコヌドの怜玢を担圓し、匕数ずしお䜕も呌び出したせん。その埌、すべおのレコヌドがマッチングに適しおいたす。その埌、レコヌドを降順で゜ヌトしたす。 、MySQL、Mongoなどのデヌタベヌスを䜿甚する堎合は、明らかな理由でidをcreatedAtに眮き換える必芁がありたす。リストの最埌は、投皿のリストの䞻芁なセクションの補品で、5゚ントリの制限がありたす。 モデルを䜿甚したすべおの手順が完了するず、投皿のリストを目的の順序ず数量で返したす。これにより、ビュヌでさらに䜿甚できたす。 以前の操䜜から芚えおいるように、 execメ゜ッドで匿名関数を䜿甚しお、最終的なデヌタ凊理を実行したす。 それでは、キヌ郚分に移りたしょう-衚瀺メ゜ッド、 ビュヌメ゜ッドは、ビュヌをコンパむルするずきに利甚できるもののリストを枡す責任がありたす。この堎合、オブゞェクトリストであり、アクセスのために、名前ポストず倀を持぀属性リスト芁玠を䜜成したす-無名関数によっお返されるposts属性。



ホリスティックビュヌ


 watch: function (req, res) { var Id = req.param('id'); Post.findOne(Id).exec(function (err, post) { if (!post) return res.send(404); if (err) return res.send(500); res.view({ post: post }); }); }
      
      





ここでは、 findOneメ゜ッドぞの匕数ずしお、識別子匕数を枡したす。これはリク゚ストでもあり、代わりにビュヌメ゜ッドからアクセスできる別の投皿のデヌタを返したす。



次に、ペヌゞネヌションずブルヌプリントのパスコントロヌラヌを芋お、プレれンテヌションに盎接進みたす。



 page: function (req, res) { var page = req.param('page'); Post.find() .sort('id DESC') .paginate({ page : page, limit: 5 }) .exec(function (err, posts) { if (err) return res.send(500); res.view({ posts: posts }); }); }
      
      







ここでは、 ペヌゞごずのレコヌドの制限ず衚瀺するスラむスのペヌゞを指定する必芁がある匕数ずしおJSONを䜿甚するpaginateメ゜ッドをここに远加した点が異なりたすが、むンデックスコントロヌラヌずほが同じです。 スラむスペヌゞをより動的にする-ペヌゞを蚭定するリク゚ストでペヌゞ倉数を䜜成する-䟿宜䞊、この匕数をgetリク゚ストずしお枡す-䞍芁なリク゚スト芁玠なしで、盎接、 パス蚭定で これを行うには、 config / routes.jsファむルを開いお線集を開始したす。 module.exports.routesに次を远加したす。



  'get /post/:page': { controller: 'post', //  action: 'page' //  },
      
      





ここで䜕が行われおいたすか 原則ずしお、すべおが非垞に簡単で、最初にリク゚ストのタむプ、URL、および送信された属性-を割り圓おたす- ペヌゞ -コントロヌラヌで䜿甚し req.param 'page' 、コントロヌラヌに送信するオプションを簡略化したしたより良いず思いたす- / post / pagepage = 2 。 ペヌゞネヌションず同時に、ナヌティリティ関数の単玔化された制埡スキヌムを蚭定したす。



  'post /post/create': { controller: 'post', action: 'create' }, 'get /post/delete/:id': { controller: 'post', action: 'delete' }, 'post /post/update': { controller: 'post', action: 'update' }
      
      







したがっお、Postコントロヌラヌを䜿甚しお基本的な操䜜を行い、最終的な力を発揮するために、プレれンテヌションを蚘述するだけで枈みたす。これがアプリケヌションの顔になりたす。 コヌドのコンパむルで問題が発生した堎合は、コメント付きのPostコントロヌラヌのフルバヌゞョンをご芧ください。



芖聎回数


Sailsビュヌはコントロヌラヌによっお自動的に構築され、Postコントロヌラヌを䜜成したした-぀たり、このコントロヌラヌのビュヌを持぀フォルダヌはviews / post / *に配眮され、ビュヌにはviewsメ゜ッドを持぀サブコントロヌラヌ名がありたす 。SailはJade、Handlebars、HAML他にもありたすが、デフォルトではEJSが組み蟌たれおいるため、ビュヌはその䞊に構築されたす。 viewsに投皿フォルダヌを䜜成し、次の内容のindex.ejsおよびpage.ejsファむルを远加したす。



views / post / index.ejsおよびviews / post / page.ejs


 <div class="container text-center"> <h2 class="text-center">MY BLOG APP</h2> <div class="row"> <div class="col-md-1"></div> <div class="col-md-10"> <% _.each(posts, function (post) { %> <div class="panel panel-default"> <div class="panel-body"> <h3 class="text-center"><%= post.title %></h3><hr> <article> <%= post.description %> </article> </div> <div class="panel-footer"> <a href="/post/watch/<%= post.id %>" class="btn btn-info">LEARN MORE</a> </div> </div> <% }) %> </div> <div class="col-md-1"> </div> <ul class="pagination"> <li><a href="/post">1</a></li> <li><a href="/post/2">2</a></li> <li><a href="/post/3">3</a></li> </ul> </div>
      
      







_.eachは最初のパラメヌタヌが倀の配列であるため、次のコヌルバックは配列の単䞀芁玠からデヌタを提䟛したす角床からのng-repeatのようなもの。次に、倀を繰り返すデヌタを構築したす。 EJSに粟通しおいる人は、倉数の倀をテキストであるため<=>で囲むか、<%%>で関数を終了するこずを理解しおいたす説明が非垞に簡単な堎合。 ですから、少なくずも盎感的なレベルでEJSに関する情報のメむンフロヌを理解しおいるず思いたす。そうでない堎合は、 ドキュメントが圹立ちたす。 最埌のビュヌは特定の投皿の単䞀の衚瀺です-views / post / watch.ejs



ビュヌ/投皿/ watch.ejs


 <div class="container"> <div class="panel panel-default"> <div class="panel-body text-center"> <h3><%= post.title %></h3><hr> <article> <%= post.content %> </article> </div> </div> </div>
      
      







これで、ブログの機胜の䞻芁郚分が䜜成されたした-投皿の䜜成、線集、削陀、ペヌゞネヌション、個々の゚ントリの衚瀺が可胜になりたしたが、珟時点では管理パネルに゚ントリを芖芚的に䜜成できるフォヌムはありたせん-初心者向けには、 Postmanを䜿甚しおテストできたす以前にコマンドでテストサヌバヌを起動した



 sails lift
      
      







最初の郚分の玠材が興味深く、有甚であり、2番目の郚分がセッションの䜜成、承認、および簡単な管理パネルの蚘述に぀いお説明するこずを望みたす。埅おない堎合、たたはコヌドの蚘述方法を誀解した堎合、完党なコメント付きのgithubで完党なプロゞェクトコヌドを芋るこずができたすそこで行われるすべおのこずを説明したす。



2蚘事の䞀郚



曞面で䜿甚される有甚なリンクず資料




All Articles