sql >> Database >  >> NoSQL >> MongoDB

Hoe gebeurtenissen te gebruiken, houd mongodb-logica uit node.js-verzoekhandlers

Hier is de oplossing die ik heb bedacht.

Ik heb mongojs gebruikt wat de mongodb-interface aanzienlijk vereenvoudigt - ten koste van flexibiliteit in configuratie - maar het verbergt de geneste callbacks die de mongodb-driver nodig heeft. Het maakt de syntaxis ook veel meer op de mongo-client.

Ik wikkel het HTTP Response-object vervolgens in een sluiting en geef deze sluiting door aan de mongodb-querymethode in een callback.

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

Het geeft in wezen nog steeds het antwoordobject door aan de databaseprovider, maar door het in een sluiting te wikkelen die weet hoe het antwoord moet worden afgehandeld, houdt het die logica uit mijn databasemodule.

Een kleine verbetering is het gebruik van een functie om een ​​antwoordafhandeling te maken buiten mijn verzoekafhandeling:

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

        response.send(data);
    };
}

Dus nu ziet mijn verzoekbehandelaar er zo uit:

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

En mijn MongoProvider ziet er zo uit:

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;

Ik kan MongoProvider ook uitbreiden voor specifieke collecties om de API te vereenvoudigen en aanvullende validatie uit te voeren:

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. Reactivemongo serialiseert een kaart in een BSONDocument

  2. Foutmelding in mongodb-castprobleem voor geldige object-ID

  3. Er is een MongoDB-waarschuwing opgetreden na het converteren van een replicaset naar een stand-alone server

  4. hoe groep in pymongo te gebruiken om vergelijkbare rijen te groeperen?