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

node.js&express-アプリケーション構造のグローバルモジュールとベストプラクティス

    ここでは別のアプローチを取りました。最高だとは言いませんが、説明させてください。

    1. 各スキーマ(およびモデル)は独自のファイル(モジュール)にあります
    2. 特定のRESTリソースのルートの各グループは、独自のファイル(モジュール)にあります
    3. 各ルートモジュールはrequire ■必要なマングースモデル(1つのみ)
    4. メインファイル(アプリケーションエントリポイント)はrequire ■それらを登録するためのすべてのルートモジュール。
    5. Mongo接続はルートファイルにあり、必要なものすべてにパラメーターとして渡されます。

    アプリルートの下に2つのサブフォルダーがあります-routes およびschemas

    このアプローチの利点は次のとおりです。

    • スキーマを作成するのは1回だけです。
    • メインアプリファイルを、RESTリソース(CRUD)ごとに4〜5ルートのルート登録で汚染しない
    • DB接続を定義するのは1回だけです

    特定のスキーマファイルは次のようになります。

    ファイル:/schemas/theaterSchema.js

    module.exports = function(db) {
            return db.model('Theater', TheaterSchema());
    }
    
    function TheaterSchema () {
            var Schema = require('mongoose').Schema;
    
            return new Schema({
                title: { type: String, required: true },
                description: { type: String, required: true },
                address: { type: String, required: true },
                latitude: { type: Number, required: false },
                longitude: { type: Number, required: false },
                phone: { type: String, required: false }
        });
    }
    

    特定のリソースのルートのコレクションは次のようになります。

    ファイル:/routes/theaters.js

    module.exports = function (app, options) {
    
        var mongoose = options.mongoose;
        var Schema = options.mongoose.Schema;
        var db = options.db;
    
        var TheaterModel = require('../schemas/theaterSchema')(db);
    
        app.get('/api/theaters', function (req, res) {
                var qSkip = req.query.skip;
                var qTake = req.query.take;
                var qSort = req.query.sort;
                var qFilter = req.query.filter;
                return TheaterModel.find().sort(qSort).skip(qSkip).limit(qTake)
                .exec(function (err, theaters) {
                        // more code
                });
        });
    
        app.post('/api/theaters', function (req, res) {
          var theater;
    
          theater.save(function (err) {
            // more code
          });
          return res.send(theater);
        });
    
        app.get('/api/theaters/:id', function (req, res) {
          return TheaterModel.findById(req.params.id, function (err, theater) {
            // more code
          });
        });
    
        app.put('/api/theaters/:id', function (req, res) {
          return TheaterModel.findById(req.params.id, function (err, theater) {
            // more code
          });
        });
    
        app.delete('/api/theaters/:id', function (req, res) {
          return TheaterModel.findById(req.params.id, function (err, theater) {
            return theater.remove(function (err) {
              // more code
            });
          });
        });
    };
    

    そして、これが接続を初期化し、すべてのルートを登録するルートアプリケーションファイルです:

    ファイル:app.js

    var application_root = __dirname,
            express = require('express'),
            path = require('path'),
            mongoose = require('mongoose'),
            http = require('http');
    
    var app = express();
    
    var dbProduction = mongoose.createConnection('mongodb://here_insert_the_mongo_connection_string');
    
    app.configure(function () {
            app.use(express.bodyParser());
            app.use(express.methodOverride());
            app.use(app.router);
            app.use(express.static(path.join(application_root, "public")));
            app.use('/images/tmb', express.static(path.join(application_root, "images/tmb")));
            app.use('/images/plays', express.static(path.join(application_root, "images/plays")));
            app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
    });
    
    app.get('/api', function (req, res) {
            res.send('API is running');
    });
    
    var theatersApi = require('./routes/theaters')(app, { 'mongoose': mongoose, 'db': dbProduction });
    // more code
    
    app.listen(4242);
    

    これがお役に立てば幸いです。



    1. 別のモデルで定義されたマングースデータベースのスキーマを取得する方法

    2. アグリゲーションフレームワークパイプラインの配列サブセット

    3. MySQL、MongoDB、PostgreSQLのバックアップ暗号化機能-ClusterControl 1.5.1

    4. パフォーマンスを再実行し、jsonオブジェクトを文字列として保存します