MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara menggunakan acara menjauhkan logika mongodb dari penangan permintaan node.js

Inilah solusi yang saya buat.

Saya menggunakan mongojs yang sangat menyederhanakan antarmuka mongodb --dengan biaya fleksibilitas dalam konfigurasi-- tetapi ia menyembunyikan panggilan balik bersarang yang dibutuhkan driver mongodb. Itu juga membuat sintaks lebih mirip klien mongo.

Saya kemudian membungkus objek Respons HTTP dalam suatu penutupan dan meneruskan penutupan ini ke metode kueri mongodb dalam suatu panggilan balik.

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

Itu pada dasarnya masih hanya meneruskan objek respons ke penyedia basis data, tetapi dengan membungkusnya dalam penutupan yang tahu bagaimana menangani respons, itu membuat logika itu keluar dari modul basis data saya.

Sedikit peningkatan adalah dengan menggunakan fungsi untuk membuat penutupan penangan respons di luar penangan permintaan saya:

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

        response.send(data);
    };
}

Jadi sekarang penangan permintaan saya hanya terlihat seperti ini:

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

Dan MongoProvider saya terlihat seperti ini:

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;

Saya juga dapat memperluas MongoProvider untuk koleksi tertentu guna menyederhanakan API dan melakukan validasi tambahan:

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. Menghapus database.yml saat menggunakan Mongoid di Rails 3.2

  2. Agregat Mongodb:konversikan tanggal ke zona waktu lain

  3. $addFields bersarang di MongoDB

  4. Memelihara Kumpulan Replika MongoDB di Cloud Menggunakan Ansible

  5. Pemuatan lambat menggunakan nodejs dan mongoDB sebagai data backend