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

イベントの使用方法は、mongodbロジックをnode.jsリクエストハンドラーから除外します

    これが私が思いついた解決策です。

    mongojs を使用しました これにより、mongodbインターフェースが大幅に簡素化されますが、構成の柔軟性が犠牲になりますが、mongodbドライバーが必要とするネストされたコールバックが非表示になります。また、構文がmongoクライアントに非常に似たものになります。

    次に、HTTP Responseオブジェクトをクロージャでラップし、このクロージャをコールバックでmongodbクエリメソッドに渡します。

    var MongoProvider = require('./MongoProvider');
    MongoProvider.setCollection('things');
    
    exports.index = function(request, response){
        function sendResponse(err, data) {
            if (err) { 
                response.send(500, err);
            }    
            response.send(data);
        };
    
        MongoProvider.fetchAll(things, sendResponse);
    };
    

    基本的には、応答オブジェクトをデータベースプロバイダーに渡すだけですが、応答の処理方法を知っているクロージャーでラップすることにより、そのロジックをデータベースモジュールから除外します。

    わずかな改善点は、関数を使用して、リクエストハンドラーの外部にレスポンスハンドラークロージャーを作成することです。

    function makeSendResponse(response){
        return function sendResponse(err, data) {
            if (err) {
                console.warn(err);
                response.send(500, {error: err});
                return;
            }
    
            response.send(data);
        };
    }
    

    これで、リクエストハンドラは次のようになります:

    exports.index = function(request, response) {
        response.send(makeSendResponse(response));
    }
    

    そして、私のMongoProviderは次のようになります:

    var mongojs = require('mongojs');
    
    MongoProvider = function(config) {
    this.configure(config);
        this.db = mongojs.connect(this.url, this.collections);
    }
    
    MongoProvider.prototype.configure = function(config) {
        this.url = config.host + "/" + config.name;
        this.collections = config.collections;
    }
    
    MongoProvider.prototype.connect = function(url, collections) {
        return mongojs.connect(this.url, this.collections);
    }
    
    MongoProvider.prototype.fetchAll = function fetchAll(collection, callback) {
        this.db(collection).find(callback);
    }
    
    MongoProvider.prototype.fetchById = function fetchById(id, collection, callback) {
        var objectId = collection.db.bson_serializer.ObjectID.createFromHexString(id.toString());
    
        this.db(collection).findOne({ "_id": objectId }, callback);
    }
    
    MongoProvider.prototype.fetchMatches = function fetchMatches(json, collection, callback) {
        this.db(collection).find(Json.parse(json), callback);
    }
    
    module.exports = MongoProvider;
    

    特定のコレクション用にMongoProviderを拡張して、APIを簡素化し、追加の検証を行うこともできます。

    ThingsProvider = function(config) {
        this.collection = 'things';
        this.mongoProvider = new MongoProvider(config);
        things = mongoProvider.db.collection('things');
    }
    
    ThingsProvider.prototype.fetchAll = function(callback) {
        things.fetchAll(callback);
    }
    
    //etc...
    
    module.exports = ThingsProvider;
    


    1. PythonでのMongodbの一括挿入制限

    2. mongodb:特定のドキュメントを取得してから残りを取得するための最良の方法

    3. WindowsでRedisを実行するにはどうすればよいですか?

    4. php7をmongoDBに接続する方法