MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak używać zdarzeń, trzymaj logikę mongodb poza obsługą żądań node.js

Oto rozwiązanie, które wymyśliłem.

Użyłem mongojs co znacznie upraszcza interfejs mongodb — kosztem elastyczności konfiguracji — ale ukrywa zagnieżdżone wywołania zwrotne wymagane przez sterownik mongodb. Sprawia również, że składnia jest bardziej podobna do klienta mongo.

Następnie zawijam obiekt odpowiedzi HTTP w zamknięcie i przekazuję to zamknięcie do metody zapytania mongodb w wywołaniu zwrotnym.

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);
};

Zasadniczo nadal przekazuje obiekt odpowiedzi do dostawcy bazy danych, ale pakując go w zamknięcie, które wie, jak obsłużyć odpowiedź, utrzymuje tę logikę poza moim modułem bazy danych.

Niewielkim ulepszeniem jest użycie funkcji do utworzenia zamknięcia obsługi odpowiedzi poza moją obsługą żądania:

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

        response.send(data);
    };
}

Więc teraz mój program obsługi żądań wygląda tak:

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

Mój MongoProvider wygląda tak:

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;

Mogę również rozszerzyć MongoProvider o określone kolekcje, aby uprościć interfejs API i przeprowadzić dodatkową walidację:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy istnieje agnostyczna baza danych framework nosql dla platformy .NET?

  2. Błąd E QUERY [wątek1] SyntaxError:nieprawidłowy identyfikator właściwości @(shell) przy użyciu i/lub funkcji find()

  3. MongoDB — nie można użyć .explain(), aby uzyskać informacje o zapytaniu w kodzie C#?

  4. embedmongo z reactivemongo proces się nie kończy

  5. Co to jest MongoDB i jak to działa?