Meteorチュートリアル:Meteorを使用したリアルタイムWebアプリケーションの構築
公開: 2022-03-11Meteorは、Webおよびモバイルアプリケーション用のフルスタックJavaScriptフレームワークです。 それは2011年から存在しており、ラピッドプロトタイピングのための理想的で使いやすいソリューションであるという点でMeteor開発者の間で高い評価を得ています。 しかし、最近、開発者はMeteorがもはやプロトタイピングのためだけのものではなく、商用開発に使用する準備ができていることに気づきました。 それが提供するパッケージの武器、それが依存する堅固なmongoDB / node.js基盤、そしてそれが提供するコーディングの柔軟性を備えています。 Meteorを使用すると、ブラウザアプリからサーバーやデータベースまですべてを処理して、堅牢で安全なリアルタイムWebアプリケーションを簡単に構築できます。
このMeteorチュートリアルでは、Meteorで基本的なWebアプリケーションを作成する方法について説明します。これは、ユーザーがログインして書籍のリストを管理できるシンプルなカタログです。
なぜMeteorを使うのですか? 簡単に言えば、「Meteorは楽しいから」です。 Webアプリケーションの開発が簡単になります。 習得は簡単で、データの同期とページの提供の基本よりも、アプリケーションの機能に集中できます。
また、便利な動作が多数組み込まれています。Meteorはライブ更新を自動的に実行するため、データの変更はブラウザウィンドウにすぐに表示され、アプリケーション自体へのコード変更もすべてのブラウザとデバイスに「リアルタイム」でプッシュされます。 Meteorにはレイテンシー補正が組み込まれており、展開が簡単で、あらゆる種類の機能を処理するインストールが簡単な「パッケージ」があります。
比較的新しいフレームワークですが、RespondlyやTelescopeなどの比較的大規模なサービスを含め、多くのスタートアップがすでにMeteorアプリを構築しています。
流星の設置と足場
*nixシステムへのMeteorのインストールはワンライナーです。
curl https://install.meteor.com/ | sh
まだ公式のサポートはありませんが、Windowsのプレビューは順調に進んでいます。 Windowsサポートは2015年4月または5月にリリースされる1.1で出荷されるという噂があります。Meteorのようなスマートフレームワークから期待できるように、アプリケーションをブートストラップするには、1行のコマンドを呼び出す必要があります。
meteor create book-list
これにより、「book-list」という名前のディレクトリが作成され、定型文と依存コードが入力されます。 アプリケーションを実行するには、新しく作成したディレクトリに入り、次のコマンドを実行します。
meteor
Webブラウザでhttp://localhost:3000
を開くと、次のように表示されます。
また、JSFiddle for Meteor:Book List:Default AppのようなサイトであるMeteorPadで、アプリケーションの「バージョン0」を確認することもできます。
MeteorはビューをHTMLファイルに保存します。 「book-list.html」を開くと、次のように表示されます。
<head> <title>book-list</title> </head> <body> <h1>Welcome to Meteor!</h1> {{> hello}} </body> <template name="hello"> <button>Click Me</button> <p>You've pressed the button {{counter}} times.</p> </template>
Meteorは、テンプレートエンジンである「Blaze」を使用して、これらのHTMLファイルからの応答をレンダリングします。 二重中括弧は、Handlebars.js(または他の同様のテンプレートエンジン)を使用したことのある人なら誰でも知っているはずであり、ここでも同様の機能を果たします。 Blazeは、二重中括弧の各ペア内の式を調べ、それぞれをこれらの式が生成する値に置き換えます。
この単純なサンプルプログラムには、2つの中括弧で囲まれた式があります。
最初の「{{>hello}}」は、「hello」というテンプレートを含めるようにBlazeに指示します。 そのテンプレートは、ファイルの下部の<template name =” hello”>セクションで定義されています。
2番目の「{{counter}}」はもう少し複雑です。 この「カウンター」値がどこから来ているかを確認するには、「book-list.js」を開く必要があります。
if (Meteor.isClient) { // counter starts at 0 Session.setDefault('counter', 0); Template.hello.helpers({ counter: function () { return Session.get('counter'); } }); Template.hello.events({ 'click button': function () { // increment the counter when button is clicked Session.set('counter', Session.get('counter') + 1); } }); } if (Meteor.isServer) { Meteor.startup(function () { // code to run on server at startup }); }
ここで説明する必要があることがいくつかあります。 まず、「if(Meteor.isClient)」と「if(Meteor.isServer)」に分割します。 meteorはフルスタックフレームワークであるため、作成するコードはサーバーとクライアントの両方で実行されることを思い出してください。 これらの条件により、次のことを制限できます。最初のブロックはクライアントでのみ実行され、2番目のブロックはサーバーでのみ実行されます。
次に、「Session.setDefault」呼び出しがあります。これにより、ブラウザーで「counter」と呼ばれるセッション変数が初期化されます。 セッション変数は、Meteorのグローバルのように機能します(善と悪のために)。 ただし、そのセッション変数は「{{counter}}」に直接表示されません。 代わりに、その「counter」式は「helper」であり、「Template.hello.helpers」セクションで定義されています。 このヘルパーは、単にセッション変数の値を取得して返します。
ヘルパーは「リアクティブ」であることに注意してください。 これは、セッション変数が変更されるたびに、Meteorがそれを参照しているこのヘルパー関数を自動的に再実行し、Blazeが新しいコンテンツでブラウザーを自動的に更新することを意味します。
クライアントコードは、「Template.hello.events」を介してイベントも監視します。 イベントタイプとセレクター(この場合は「クリックボタン」)によってイベントを識別し、Meteorにそのイベントが何をすべきかを伝えます。 この場合、セッション変数がインクリメントされ、ヘルパー関数が再実行され、コンテンツが再レンダリングされます。
静的データの表示
これらはすべてうまく機能していますが、このチュートリアルで必要なMeteorアプリケーションではありません。
このアプリケーションの調整を始めましょう。静的でハードコードされた本のリストを表示します。 今のところ、本のリストをセッション変数に隠しておきます。 「isClient」コードでは、「Template.hello.rendered」を使用して、bookListテンプレートがレンダリングされるとすぐにセッション変数を設定します。
Template.hello.rendered = function() { Session.setDefault('books', [ {title: "To Kill a Mockingbird", author: "Harper Lee"}, {title: "1984", author: "George Orwell"}, {title: "The Lord of the Rings", author: "JRR Tolkien"}, {title: "The Catcher in the Rye", author: "JD Salinger"}, {title: "The Great Gatsby", author: "F. Scott Fitzgerald"} ]); };
次に、「hello」テンプレートの新しいヘルパーを使用して、そのセッション変数を返します。
Template.hello.helpers({ books: function () { return Session.get('books'); } });
そして、「hello」テンプレートの変数補間を介して画面に表示します。
<template name="hello"> <h3>Here are your books:</h3> {{ books }} </template>
Meteorpadでこのコードの動作を確認できます:Book-List:Show Session Variable
最初に気付くのは、Meteorサーバーがコードベースへの変更を自動的に検出し、新しいコードをクライアントにプッシュし、クライアントにリロードを促すことです。 アプリケーションをデプロイした後でも、変更をデプロイし、ホットコードプッシュを介してクライアントを自動的に更新できます。
これまでのところ、これは私たちが得るものです:
おっと、データが間違って表示されています。 Blazeはここで正確さのポイントを取得します(なぜそうです、それはオブジェクトの配列です)が、本のリストを便利な方法で表示したい場合は、もう少し賢くする必要があります。 幸い、Blazeを使用すると、「#each」ディレクティブを使用してデータの配列を非常に簡単に操作できます。
<h3>Here are your books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL>
Blazeでは、「#each」はAngularの「ng-repeat」ディレクティブのように機能します。配列構造を反復処理し、現在のコンテキストを配列内の現在のオブジェクトに設定し、「{{#each」内にHTMLを繰り返し表示します。 …}}」。 これが私たちの本のリストが今どのように見えるかです:
MeteorPadの場合:セッション変数を適切に表示する
いくつかのクリーンアップ
先に進む前に、コードを少しクリーンアップしましょう。
Meteorを使用すると、コードベースを整理する方法に大きな余裕ができます。 ご覧のとおり、厳格なルールはごくわずかです。HTMLとJavaScriptをどこに置いても、Meteorはそれを見つけます。 この柔軟性は素晴らしいですが、それは意味のある方法でコードを整理することがあなたの義務であることを意味します。そのため、巨大な無秩序な混乱を維持することに固執することはありません。
まず、この「hello」テンプレートの名前を「bookList」などの意味のあるものに変更し、定型HTMLを次のように置き換えます。
<head> <title>book-list</title> </head> <body> {{> bookList}} </body> <template name="bookList"> <h3>Here are some books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL> </template>
次に、「クライアント」と「サーバー」の部分を別々のファイルに分割しましょう。 アプリケーションディレクトリに、「client」サブディレクトリと「server」サブディレクトリを設定します。Meteorは、クライアントで「/ client /」ファイルを実行し、「/server/」ファイルを実行することを自動的に認識します。サーバ。 テンプレートにちなんで名付けられたJavaScriptファイルにテンプレートコードを入れるのは良い慣習なので、クライアントコードを「client/bookList.js」に入れましょう。 現在空のサーバー起動コードを「server/startup.js」に入れることができます。 最後に、「 」テンプレートコードを「client/bookList.html」に追加します。
このように切り替えた後でも、MeteorはすべてのHTMLファイルとJavaScriptファイルを自動的に検出することに注意してください。 ファイルが「/client/」のどこかにある限り、Meteorはそれをクライアントで実行することを認識します。 ファイルが「/server/」のどこかにある限り、meteorはそれをサーバー上で実行することを認識します。 繰り返しますが、物事を整理しておくのは開発者次第です。
したがって、コードは次のようになります。
book-list.html:
<head> <title>book-list</title> </head> <body> {{> bookList}} </body>
client / bookList.html:
<template name="bookList"> <h3>Here are some books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL> </template>
client / bookList.js:
Template.bookList.rendered = function() { Session.setDefault('books', [ {title: "To Kill a Mockingbird", author: "Harper Lee"}, {title: "1984", author: "George Orwell"}, {title: "The Lord of the Rings", author: "JRR Tolkien"}, {title: "The Catcher in the Rye", author: "JD Salinger"}, {title: "The Great Gatsby", author: "F. Scott Fitzgerald"} ]); }; Template.bookList.helpers({ books: function () { return Session.get('books'); } });
server / startup.js:
Meteor.startup(function () { // code to run on server at startup }); ~~~ Check it out on MeteorPad: [Initial Code Cleanup](http://meteorpad.com/pad/MwvMcsBAzfbWwEXp3/Book-List:%20Initial%20Code%20Cleanup) Verify that everything's running correctly by checking the browser window and then we're good to move on to the next step. ## Using the Database in Meteor The Meteor server runs on top of a MongoDB database. In this section of our tutorial, we will move the static list of books out of the session variable and into that database. First, delete the Template.bookList.rendered code, so that we're no longer putting stuff into that session variable. Next, we should add that list of books to the database as fixture data when the server initializes. As you'd expect for MongoDB, Meteor stores data in "collections". So, we'll create a new collection for our books. To keep things simple we will name it "books". It turns out that both the client and the server will want to know about this collection, so we'll put this code in a new subfolder: "/lib/". Meteor knows automatically that files in "/lib/" run on the client and the server. We'll create a file called "lib/collections/books.js", and give it just one line of code: ~~~ js Books = new Meteor.Collection("books");
http:// localhost:3000を指すブラウザウィンドウ内で、開発者コンソールに移動し、「Books」の値を確認します。 これでMongoコレクションになります。 「Books.find()。fetch()」を実行してみると、空の配列が表示されます。これは、まだ本を追加していないため、理にかなっています。 コンソールでアイテムを追加してみることができます。

Books.insert({title: "To Kill a Mockingbird", author: "Harper Lee"})
コンソールに物を追加するのはかなり面倒です。 代わりに、サーバーの起動時にフィクスチャデータをデータベースに自動的に挿入するように設定します。 それでは、「server / startup.js」に戻って、これを追加しましょう。
Meteor.startup(function () { if (!Books.findOne()) { Books.insert({title: "To Kill a Mockingbird", author: "Harper Lee"}); Books.insert({title: "1984", author: "George Orwell"}); Books.insert({title: "The Lord of the Rings", author: "JRR Tolkien"}); Books.insert({title: "The Catcher in the Rye", author: "JD Salinger"}); Books.insert({title: "The Great Gatsby", author: "F. Scott Fitzgerald"}); } });
これで、サーバーの起動時にデータが存在しない場合は、フィクスチャデータを追加します。 これを確認するには、ターミナルに戻り、流星サーバーを停止して、次のコマンドを実行します。
meteor reset
注:Meteorが使用しているデータベースをリセット(つまり、クリア)するため、このコマンドが必要になることはめったにありません。 Meteorアプリケーションのデータベースにユーザーデータがある場合は、このコマンドを実行しないでください。 ただし、この場合は、テストデータをすべてクリアします。
次に、サーバーを再起動します。
meteor
起動時に、Meteorは起動ルーチンを実行し、データベースが空であることを確認して、フィクスチャデータを追加します。 この時点で、コンソールに移動して「Books.find()。fetch()」と入力すると、以前に持っていた5冊の本が得られます。
このステップに残っているのは、本を画面に表示することだけです。 幸い、これは「return Session.get('books');」を置き換えるのと同じくらい簡単です。 「本」ヘルパーでは次のようになります。
return Books.find();
そして、私たちはビジネスに戻ってきました! アプリケーションは、セッション変数からではなく、データベースカーソルからのデータを表示しています。
MeteorPadでチェックしてください:データベースへの移動
セキュリティ上の懸念
私はこれを「これをしないでください」と言って前置きします。
誰かがブラウザでこのアプリを起動し、コンソールに移動して「Books.remove({})」と入力するとどうなると思いますか?
答えは:彼らはコレクションを一掃するでしょう。
つまり、これはかなり大きなセキュリティ問題です。ユーザーはデータベースにアクセスしすぎています。 すべてのクライアントがデータベース全体にアクセスできます。 それだけでなく、どのクライアントも、「。remove({})」データのワイプアウトを含め、データベース全体に変更を加えることができます。
これは良くないので、修正しましょう。
Meteorは、機能を追加するためにいわゆる「パッケージ」を使用します。 Node.jsにとってのモジュールとRubyにとってのgemは、Meteorの機能のバンドルされた優れた機能です。 いろいろなもののパッケージがあります。 利用可能なものを閲覧するには、atmosphere.jsをチェックしてください。
「meteorcreate」で作成したデフォルトのmeteorアプリには、「autopublish」と「insecure」という2つのパッケージが含まれています。 最初のパッケージは、クライアントがデータベース全体に自動的にアクセスできるようにし、2番目のパッケージは、ユーザーがそのデータベースに対して任意のアクションを実行できるようにします。
それらを削除しましょう。 これを行うには、アプリディレクトリから次のコマンドを実行します。
meteor remove autopublish insecure
これが完了すると、ブックリストデータが画面に表示されなくなり(アクセスできなくなったため)、「Books.insert」呼び出しを試行すると、「挿入に失敗しました」というエラーが表示されます。 : アクセス拒否"。 MeteorPadの場合:セキュリティの行き過ぎ
このMeteorチュートリアルから他に何も取らない場合は、次のことを覚えておいてください。Meteorアプリをデプロイするときは、自動公開された安全でないパッケージを必ず削除してください。 Meteorには多くの優れたセキュリティ対策がありますが、これら2つのパッケージをインストールしたままにしておくと、それらはすべて無駄になります。
では、セキュリティ上の問題があるのに、なぜMeteorはこれらのパッケージを自動的に含めるのでしょうか。 その理由は、特に初心者の場合、これら2つのパッケージを使用すると、開始が簡単になります。ブラウザーのコンソールからデータベースを簡単にデバッグおよび微調整できます。 ただし、自動公開を廃止し、できるだけ早く安全を確保しないことをお勧めします。
パブリッシュおよびサブスクライブ
そこで、そのギャップのあるセキュリティホールを修正しましたが、2つの問題が発生しました。 まず、データベースにアクセスできなくなりました。 次に、データベースを操作する方法がありません。
ここで最初の問題に取り組みましょう。 Meteorは、サーバーにデータベースのサブセットを「公開」させ、クライアントにその公開を「サブスクライブ」させることにより、データベースへの安全なアクセスを提供します。
まず、「/ server/publications.js」を作成しましょう。
Meteor.publish('books', function() { return Books.find({}); });
そして、「/ client/subscriptions.js」を作成します。
Meteor.subscribe('books');
MeteorPadでチェックしてください:パブリッシュアンドサブスクライブ
サーバーはすべてのデータにアクセスできるカーソルを「公開」し、クライアントはもう一方の端でカーソルを「サブスクライブ」します。 クライアントはこのサブスクリプションを使用して、データベースのミラーリングされたコピーにカーソルのすべてのデータを入力します。 「Books.find()。fetch()」にアクセスすると、5つのオブジェクトすべてが表示され、以前と同じように画面に表示されます。
現在の違いは、クライアントがアクセスできるものを制限するのが本当に簡単なことです。 パブリケーション「find()」をデータのサブセットに切り替えてみてください。
Meteor.publish('books', function() { return Books.find({}, {limit:3}); });
現在、クライアントは5冊の本のうち3冊しか見ることができず、残りの本にたどり着く方法はありません。 これはセキュリティにとって大きな恩恵であるだけでなく(他の人の銀行口座を見ることができない)、データを分割してクライアントの過負荷を回避するために使用できます。
新しい本を追加する
制限された安全な方法で、クライアントにデータベースへの読み取りアクセスを許可する方法を見てきました。 次に、2番目の問題を見てみましょう。ユーザーがやりたいことを何もできないようにせずに、ユーザーがデータベースを変更できるようにするにはどうすればよいでしょうか。 パッケージを安全でない状態で削除すると、クライアントはまったくアクセスできなくなります。もう一度、本の追加を許可してみましょう。 流星では、サーバーに「メソッド」を追加することでこれを行います。 新しい本を追加するメソッドを「/lib/collections/books.js」に追加しましょう。
Meteor.methods({ addBook: function(bookData) { var bookID = Books.insert(bookData); return bookID; } });
ご覧のとおり、これは「bookData」(この場合は「title」フィールドと「author」フィールドを持つオブジェクト)を取り込み、データベースに追加します。 クライアントがリロードすると、クライアントからこのメソッドを呼び出すことができます。 コンソールに移動して、次のように入力できます。
Meteor.call('addBook', {title: "A Tale of Two Cities", author: "Charles Dickens"})
そしてプレスト! あなたは本のリストに別の本を手に入れます。 コンソールの使用は非常に扱いにくいので、先に進んで、新しい本を追加できるようにする「bookList」テンプレートの最後に簡単なフォームを追加しましょう。
<form class="add-book"> Title:<br> <input type="text" name="title"> <br> Author:<br> <input type="text" name="author"> <input type="submit" value="Add Book"> </form>
そして、元のテストアプリケーションの場合と同様に、イベントケースを使用してJavaScriptに接続できます。
Template.bookList.events({ "submit .add-book": function(event) { event.preventDefault(); // this prevents built-in form submission Meteor.call('addBook', {title: event.target.title.value, author: event.target.author.value}) } });
MeteorPad:メソッドでこれが実際に動作しているのを見ることができます
安全性が低く自動公開されている場合、クライアントはデータベース全体にアクセスして変更する可能性があります。 安全でない自動公開がなくなりましたが、公開、サブスクリプション、およびメソッドを使用すると、クライアントはデータベースにアクセスし、制御された方法でデータベースと対話できます。
ちなみに、「許可と拒否のルール」を使用して、Meteorのセキュリティ問題に対処することもできます。 これらの詳細と、私が上記のアプローチを好むいくつかの理由については、discovermeteor.comをご覧ください。
ユーザ認証
始めたところに戻ったように見えるかもしれませんが、重要な違いが1つあります。それは、データベースへのアクセスを制限するのが非常に簡単なことです。 これがどのように機能するかを確認するために、このアプリにユーザーを追加してみましょう。 アプリにログインシステムを追加し、すべてのクライアントが1つのシステム全体の書籍リストを操作するのではなく、各ユーザーが自分の書籍リストにのみ追加または閲覧できるようにします。
appディレクトリに移動し、次の2つのパッケージをインストールします。
meteor add accounts-ui accounts-password
三。 アプリにログインシステムを追加しました。 次に、ログインUIをbook-list.htmlに追加する必要があります。 この一行を体の上部に置きます。
{{> loginButtons}}
画面の上部にログインプロンプトが表示されます。
ログインリンクをクリックすると、メールアドレスとパスワードの入力を求められることに注意してください。 以下を含む「/client/config.js」を作成することで、単純なユーザー名/パスワードログインシステムに切り替えることができます。
Accounts.ui.config({ passwordSignupFields: "USERNAME_ONLY" });
この時点で、コンソールに「Meteor.userId()」と入力すると、「null」が返されます。 リンクをクリックしてアカウントを作成してみてください。 「Meteor.userId()」を呼び出すと、ID文字列が返されるはずです。 サーバーはこれと同じ情報(「this.userId」として)にアクセスできるため、「本を追加」メソッドでユーザーに強制的にログインさせ、userIDフィールドを含めるのは簡単です。
Meteor.methods({ addBook: function(bookData) { if (this.userId) { bookData.userID = this.userId; var bookID = Books.insert(bookData); return bookID; } } });
現在残っているのは、このユーザーが追加した本だけを表示して、クライアントを制限することだけです。 パブリケーションの機能を使用して、クライアントがアクセスできるものを絞り込みます。
Meteor.publish('books', function() { return Books.find({userID: this.userId}); });
現在、出版物はこの特定のユーザーからの本のみを検索します。 Blaze式から「{{currentUser}}」としてuserIdにアクセスすることもできます。 これを「{{#if}}」ディレクティブ(これはあなたが思っていることを正確に実行します)とともに使用して、ユーザーがログインしているときにのみデータを表示できます。
<template name="bookList"> {{#if currentUser}} <h3>Here are your books:</h3> <UL> {{#each books}} <LI><i>{{title}}</i> by {{author}}</LI> {{/each}} </UL> <form class="add-book"> Title:<br> <input type="text" name="title"> <br> Author:<br> <input type="text" name="author"> <input type="submit" value="Add Book"> </form> {{else}} <h3>Please log in to see your books</h3> {{/if}} </template>
MeteorPadで最終結果を確認してください:ユーザー
展開
これで、このMeteorアプリケーションをインターネットにデプロイできます。 これを行うには、ターミナルのアプリケーションディレクトリに移動して、次のコマンドを実行します。
meteor deploy <your app's name>.meteor.com
「<アプリの名前>」は、アプリケーションインスタンスの実際の短い名前に置き換えてください。 このコマンドを実行すると、Meteorでアカウントを設定するように求められ、インターネットで試すことができるように、新しいアプリケーションがMeteorのテストサーバーに配置されます。
簡単なデモのために、このmeteor.comソリューションが必要なすべてです。 Meteorチームは、サーバーのストレージまたは帯域幅に対する明示的な制限を発表していません。 唯一の注目すべき制限は、アプリが長期間使用されない場合、サイトが次のユーザーのために起動するのに数秒かかることです。
とはいえ、meteor.comは商用利用を目的としたものではありません。 しかし、本番環境に移行すると、ModulusやDigitalOceanなどのPlatform-as-a-Service企業がMeteorアプリの導入を容易にします。 自分のサーバーにmeteorアプリをデプロイする場合は、「meteorup」を使用するとそのプロセスも簡単になります。
次のステップ
おめでとう! Meteorを学ぶために、非常にシンプルなリアルタイムMeteorWebアプリケーションを作成してデプロイしました。 明らかに、これは機能の全世界へのほんの小さな第一歩です。 これまでに見たものが気に入った場合は、DavidTurnbullによるYourFirst Meteor Applicationを強くお勧めします。このアプリケーションでは、より複雑なアプリケーションの作成について説明し、途中で流星の機能に関する詳細情報を提供します。 Kindleの本として低価格で、TurnbullのWebサイトから無料のPDFとして入手できます。
Meteorで利用できるパッケージについても調べる必要があります。 10回のうち9回、「Meteorで<x>を実行するにはどうすればよいですか?」に対する回答。 「そのためのパッケージがあります」です。 「アプリケーションにルーティングを追加するにはどうすればよいですか?」 IronRouterを使用します。 「RESTfulAPIを提供するにはどうすればよいですか?」 RESTivusを使用します。 「ユニットテストを含めるにはどうすればよいですか?」 Velocityを使用します。 「スキーマ検証を追加するにはどうすればよいですか?」 Collection2を使用します。 利用可能なすべてのパッケージを見ると、Atmosphere.jsで簡単に迷子になる可能性があります。
Meteorを使ってみませんか?
このチュートリアルからわかるように、Meteorはアプリケーションを作成するのが簡単で楽しいですが、欠点について言及しなかった場合は残念です。
流星はまだ比較的未成熟です。 今年の10月に1.0に達し、それがいくつかの問題につながります。 あいまいなことをしたい場合は、まだその機能のパッケージを作成している人がいない可能性があります。 存在するパッケージにはバグがある可能性が高くなります。これは、すべての問題を解決するのに十分な時間がないためです。
Meteorでは、スケーリングも多少不明な場合があります。 妥当な数のユーザーにスケールアップするMeteorサイトはたくさんありますが、非常に大規模なサイトはほとんどありません。FacebookやLinkedInのようなものはなく、数千万から数億のユーザーがいます。
ただし、ほとんどのアプリケーションでは、Meteorは開発時間を短縮し、素晴らしいものの開始に参加するチャンスであるため、最適な選択です。