Пример приложения на Node.js + Express + MongoDB Native Driver в продолжение темы предыдущего поста, которое можно рассматривать в качестве "заготовки" модели. Приложение использует общий конструктор моделей доступа к данным, в котором для примера реализован единственный метод для извлечения одного документа коллекции, кэш созданных объектов, а также кэш запросов к базе данных.
Исходный код приложения:
app.js:
model.js:
db.js:
Результат после серии обращений по адресам http://localhost:1337/test и http://localhost:1337/message на стороне сервера выглядит примерно так:
Интервал обновления кэша запросов такой огромный - целых 10 секунд - разумеется в демонстрационных целях, думаю в реальном приложении могло бы хватить 50-100 мс. Прочие методы в прототип конструктора добавляем самостоятельно :).
p.s.: На ECMAScript 6 все могло бы выглядеть гораздо интереснее, но об этом как-нибудь в другой раз...
Исходный код приложения:
app.js:
var express = require('express'); var app = express(); var test = require('./model')({prop: 'test'}); var messages = require('./model')({prop: 'messages'}); app.get('/test', function (req, res) { test.findOne({}, {_id: 0}, function(err, item) { if (err) return res.json({err: err.message}); res.json(item); }); }); app.get('/message', function (req, res) { messages.findOne({}, function(err, item) { if (err) return res.json({err: err.message}); res.json(item); }); }); app.listen(1337, function() { console.log('Magic happens at http://127.0.0.1:1337/'); });
model.js:
var i = 0; // счетчик создания объекта (экземпляра класса) Model var model = {}; // кэш объектов Model var cache = {}; // кэш запросов к базе данных var cacheInt = 10000; // интервал обновления кэша запросов к базе данных var db; // подключение к базе данных require('./db')(function(connection) { db = connection; }); module.exports = Model; function Model(config) { // конструктор if (model[config.prop]) return model[config.prop]; if (!(this instanceof Model)) return model[config.prop] = new Model(config); this.prop = config.prop; this.counter = ++i; this.dbCounter = 0; // счетчик получения документа коллекции из базы данных this.cacheCounter = 0; // счетчик получения документа коллекции из кэша cache[this.prop] = {}; }; Model.prototype.findOne = findOne; function findOne(query, proj) { var cb = arguments[arguments.length - 1], qs = JSON.stringify(query), self = this; if (typeof proj !== 'object') proj = {}; if (cache[this.prop][qs]) { console.log('Getting item of %s collection from cache #%d', this.prop, ++self.cacheCounter); return cb(null, cache[this.prop][qs]); } db.collection(this.prop).findOne(query, proj, function(err, item) { if (err) return cb(err); cache[self.prop][qs] = item; console.log('Getting item of %s collection from db #%d', self.prop, ++self.dbCounter); cb(null, item); }); } (function clear() { //обновляем кэш запросов setTimeout(function() { for (var prop in cache) { cache[prop] = {}; console.log('Cache of %s collection has been cleared', prop); } clear(); }, cacheInt); }());
db.js:
var Db = require('mongodb').Db; var Server = require('mongodb').Server; module.exports = function(cb) { var db = new Db('test', new Server('127.0.0.1', 27017, { auto_reconnect: true }), {w: 'majority', safe: true}); db.open(function(err, db) { if (err) throw err; console.log('Opening new connection'); cb(db); }); };
Результат после серии обращений по адресам http://localhost:1337/test и http://localhost:1337/message на стороне сервера выглядит примерно так:
Интервал обновления кэша запросов такой огромный - целых 10 секунд - разумеется в демонстрационных целях, думаю в реальном приложении могло бы хватить 50-100 мс. Прочие методы в прототип конструктора добавляем самостоятельно :).
p.s.: На ECMAScript 6 все могло бы выглядеть гораздо интереснее, но об этом как-нибудь в другой раз...
Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации