2016-04-15 4 views
1
function _allUsers(callback){ 
    var db = connect.get(); 

    db.collection("users").find({}).toArray(function(err,data){ 
     if(err){ 
     callback(err); 
    }else{ 
     callback(null,data); 
    } 
}); 
} 

をundertandしようとしているexpressJSは、私は、Webの周りを見てきたが、私の質問があるので、私は、(私は平均スタックで新しいです)を理解するためにちょっとdefficult説明を見つけます:のMongoDBとコード

  1. コレクションメソッドは何をしますか?私は確信していませんが、文字列 "ユーザー"は、すべてのユーザーとのコレクションの名前ですか?

  2. なぜこの状況でコールバックを使用する必要がありますか? (私は非常に混乱コールバックを見つける)。

  3. なぜ、私たちには無名関数であるtoArray関数を与える必要がありますか?

  4. toArrayの代わりに、公式関数をパラメータとして使用せずにpretty method()を使用できますか?

答えて

1

MEAN Stackは、すべてのjavascriptで書かれたアプリケーションをサポートするソフトウェアプログラムのソフトウェアバンドルです。つまり、データベースのバックエンドとフロントエンドにjavascriptを使用できます。

実際には、スタックに含まれる各ソフトウェアプログラムの最初の文字を意味します。M ongoDB、E xpressjs、A ngularJSおよびN odeJS。

MongoDBはそうdocuments呼ばれる格納する(JSONに類似)BSONを使用するのNoSQLデータベースです。ドキュメントを、従来のデータベースの単一のエンティティまたは行であるかのように見てください。これらのエンティティ(または行)は、テーブルと比較可能なcollections(ドキュメントの集合)に格納されます。

したがって、第1の質問への答えは、usersコレクションを開き、すべてのユーザードキュメントへのアクセスを許可します。

NodeJS設計により、非同期です。これにより、NodeJSは単一のスレッド*上で実行しながら多くの操作を実行できます。 NodeJSはシングルスレッドなので、コードnon-blockingを書く方法が必要です。つまり、操作を開始し、他のコードを実行し、その操作が終了するたびに戻ることができます。

usersコレクションへのアクセスをリクエストした場合は、時間がかかります。アプリケーションの他の部分が処理を続けることを可能にするために、コールバックを使用します。コレクションにアクセスすると、コールバックが実行され、最初にアクセスを要求したときに実行したい操作を実行できます。

* NodeJSは実際には複数のスレッドで動作しますが、開発者はマルチスレッドについて心配する必要はありません。NodeJSはこれを行います。

これは、前のポイントが何であるかを正確です。

.toArray()メソッドは、カーソルからすべてのドキュメントを含む配列を返します。このメソッドは、カーソルを完全に反復し、すべてのドキュメントをRAMにロードしてカーソルを使い果たします。 Source

.toArray()は、集中的に処理されます。 .toArray()が終了するまで待たずにコードの残りの部分を処理し続けるため、callbackとしておくことで、準備ができたらいつでもコレクション処理に戻ることができます。

var users = db.collection("users").find({}).toArray();

これは、しかし、あなたのコードをブロックします:私はあなたが実際にブロックコードを書いて、それをこの方法で行うことができると思いdocsから読み取ることができるものから、

完全に。これを行うには、決して正当な理由はありません。

免責事項:理解を容易にするため、この説明では説明を省略または簡略化しました。

+1

これは本当に良い答えです!ありがとうございました!しかし、どのようにしてこれらのコールバックをいつ使うべきかを知ることができますか?私は時間がかかるものがあればそれを使うべきだと思っていますが、いつ使うのが良いのでしょうか?あなたがちょうどそれを説明したやり方で、私は、ファイルやデータベースを扱うときにコールバックを使うことは非常に基本的なことであると結論づけることができます。 –

+1

あなた自身のソフトウェアを書くときには、あなたがやっている操作がどれほど集中的であるか自問することはよくあります。 2つの数値を追加しているだけでは、コールバックはパフォーマンスを向上させません(実際にはオーバーヘッドのために悪化する可能性があります)。ただし、データベースに保存したりファイルに書き込んだりする場合はコールバックが不可欠です。それは本当に嫌な感じですが、私はあなたがそれのハングアップを取得すると確信しています。あなたが見つけたNPMモジュールはおそらくサポートコールバックを使用するので、それらを使用する必要があります。したがって、データベース操作やファイル操作を行うときにコールバックを実行している可能性が非常に高いです。 –

+0

ありがとうございました。 –

0
  1. db.collection('users')これは、ユーザーcollectionインスタンスを返します
  2. 我々は非同期
  3. のコールバックを使用しているtoArrayでAnnonymousの機能は、これは、使用中のライブラリに依存してそのコールバック
  4. ..です

パラメータとしての無名関数なしで

expressjsは非同期プログラミングであり、コールバックが必要です。約束

+0

あなたはその答えに好きになることはありません、あなたは私のように混乱しているようです! –

0

コレクションはMySQLのテーブルとして考えることができます。コレクションはドキュメント(MySQLの行/項目/レコード)で構成されます。あなたの例は、Usersコレクションを呼び出し、コレクション内のすべてのドキュメント(レコード)を見つけます。
コールバックについて - NodeJS/Expressは一般的にコールバック指向です。これは、使用するパターンであり、コードの大部分はasynchronousであるため、使用しています。一部のスニペットが他のスニペットの直後に実行されることを確認する必要がある場合は、コールバック(または約束)を使用する必要があります。
toArray()の呼び出しは、コールバックが期待するものによって異なります。コールバックがfind()メソッドによって返されたQueryオブジェクトを予期している場合は、このメソッドの呼び出しをスキップできます。すべてあなたのコールバックに依存します。
匿名以外の機能も使用できますが、asynchronousロジックを念頭に置いてコールバック/約束を引き続き使用する必要があります。コールバックと約束について詳しくは、this Quoraの記事を参照してください。
Herefind()の詳細については、こちらをご覧ください。