sql >> データベース >  >> NoSQL >> MongoDB

NodeJSアプリの構造(完全なJavaScriptスタック)について明確にしたい

    了解しました。これはかなり幅広い質問です。私は専門家ではありませんが、ここで最善を尽くします。

    TL; DR

    • ルート は、ユーザーがブラウザをアプリ内の特定のパスに移動したときに実行するロジックを指示するコントローラーです。これには、レンダリングするビューやそれらのビューに送信するデータなどが含まれます。
    • モデル それだけです-アプリケーション内のデータモデル
    • module.exports = 正確に何を「エクスポート」するか、つまり、メインのアプリファイルから実行またはアクセスする必要があるコードをファイルに通知します。
    • require(..) モジュールが含まれています。これを変数に設定して、後でモジュール関数を呼び出すことができます。または、それがすべて module.exports である場合は、関数を実行するだけです。 戻り値。

    これらの手法を組み合わせると、あらゆるアプリケーションの強固なフレームワークを特定するのに役立ちます。

    長い答え

    エクスプレス Node.jsアプリケーションを構造化するための強固なフレームワークを提供します。 NodeはExpressから完全に独立していますが、Expressが非常に人気があるため、実際には密接に関連しています。インストールすると、Expressを使用して、必要に応じて上に構築するためのスキャフォールドWebプロジェクト(オプション付き)を生成できます。

    コントローラー

    生成されたプロジェクトは/routes/index.jsを作成します 、(MVCを理解している場合)これは基本的にメインのコントローラー 。エクスプレスのルートは次のように書かれています:

    app.get('/path', function(req, res, next){ .. } );
    

    それを分解しましょう:私たちのアプリケーション変数(app)は、GETリクエストで'/ path'に通知されています req、res、nextを使用して匿名のコールバック関数を実行します 変数(それぞれ要求、応答、コールバック)。これをカスタムイベントハンドラーのように考えると便利だと思います。

    この時点で、 app.postを呼び出すこともできることに注意してください。 取得とは対照的に、URLへの投稿に対して同じ構文を使用します。

    匿名のコールバック内で、受信データを処理し、ユーザーのビューをレンダリングします。これが私のビジネスロジックのほとんどが終わるところなので、ここで無名関数を使用しないことは実際には理にかなっています。ホームページを表示するだけの基本的なコールバックの例を次に示します。

    app.get('/', function(req, res, next){
    
        //some business logic
    
        res.render('views/home');
    });
    

    ユーザーがアプリケーションのインデックスパス( / )を取得しようとしたとき )、 homeをレンダリングするだけです プロジェクトのルートから、 viewsに保存されているビュー フォルダ。

    しかし、これをモジュール化して、メインの app.jsですべてのルートを宣言しないようにするにはどうすればよいでしょうか。 またはserver.js

    module.exports =..を使用します モジュールに何を含めるかをサーバーに指示します。私のコントローラーでは、アプリケーションを引数として取り、それを使用して次のようにルートを定義する単一の関数をエクスポートします。

    Controllers / User.js

     module.exports = function(app){
    
        app.get('/users', function(req, res){
            var users = req.db.collection('users').find();
            if (!users) {
                console.log("no users found");
                res.redirect('/');
            } else {
                res.render('users/index', {users : users});
            }
        });
    
    };
    

    req.dbについて心配する必要はありません コード、アプリケーションのリクエストにデータベースをアタッチしますが、デフォルトでは実行されません。ここに「ユーザー」のリストが表示され、アプリのインデックスがない場合はユーザーをアプリのインデックスにリダイレクトすることを理解してください。

    モデル

    Mongooseは、モデルを作成するための優れたインターフェイスを提供します。マングースの場合、モデルの作成は3つのステップのプロセスです。

    • スキーマを定義する
    • モデルロジックを定義する
    • モデルを生成してエクスポートする

    これがUserの例です モデル:

    Models / User.js

    var mongoose = require('mongoose'),
        userSchema = new mongoose.Schema({
    
            name: { type: String, required: true },
            joinDate: {type: Date, default: date.now }
    
        }),
        User = mongoose.model('user', userSchema);
    
    module.exports = user;
    

    サーバーアプリ

    module.exports コードベースにモジュール性を定義するために使用されます。ノードアプリケーションを実行すると、最終的には単一のJavaScriptファイルが実行されます( server.js でそのファイルをすでに見たことがあります) またはapp.js )。

    複数のモデルとルートでこのファイルが大きくなりすぎないようにするには、 require(module)を使用します。 他のJSファイルからのコードを含めるため。 モジュール この場合、必要なモジュールへのパスになります。次のドキュメント構造がある場合:

    | Controllers
        - User.js
    | Models
        - User.js
    | Views
    app.js
    

    app.jsからユーザーコントローラーを含めるには 、次のように記述します: require('./ Controllers / User') 。コントローラモジュールは関数をエクスポートするだけなので、requireステートメントの直後にその関数を呼び出すことができます。最後に括弧を追加するだけです(必要なパラメータを使用して)。私のコントローラーを含めると、次のようになります:

    require('./ Controllers / User')(app)

    私のモジュール(以下)は、アプリのルートにビジネスロジックを追加する関数をエクスポートするだけなので、実際のアプリを渡します。これは呼び出す必要があるだけで、決して使用する必要はないので、後でメソッドを呼び出すための変数としてコントローラーをキャプチャしません。

    モデルが定義する操作を実行したい場合があるため、モデルを含めることは少し異なります。これを行うには、requireコードを少し変更します。

    var User =require('./ Models / User');

    これで、いつでもUserモデルのメソッドを呼び出すことができます。マングースは私たちに無料で多くの基本機能を提供します:

    User.find({}、function(err、users){..});

    上記の関数は、すべてのユーザーを検索し、 errの可能性がある無名関数を実行します。 (問題がない場合はnull)次に、JSON形式のユーザーのリスト。かなり気の利いた。

    これらの概念をすべて組み合わせることで、ExpressとNode.jsを使用して基本的なWebアプリケーションを作成できます。 Expressの使い方について明確にできることがあれば、コメントで教えてください。これは非常に表面的な知識であり、ドキュメントを掘り下げてプラグインを調べ、アプリの機能を拡張することをお勧めします。頑張ってください!




    1. マングースを仮想的に取り込む

    2. 条件とグループ化に一致するサブドキュメントの数で集計

    3. MongoDB:並列処理なしでMapReduceを使用する意味は何ですか?

    4. MongoCursorException-カーソルが見つかりません(MongoDB PHPドライバー)