Продолжаем рассматривать варианты хранения данных приложения Node.js на примере создания простого чата на TCP-сокетах. Использовать реляционные базы данных в нашем случае по-моему перебор, поэтому настоящим постом завершаем. Напоследок рассмотрим применение Mongoose ODM (Object Data Mapping).
Для начала установим модуль Mongoose:
- npm install mongoose
Создадим модуль, назовем его mongoose-connect, в котором будем конфигурировать Mongoose - выводить в консоль сообщения в ответ на соответствующие события, а также валидно закрывать подключение в случае завершения работы приложения:
Редактируем код сервера - файл server.js - импортируем модуль mongoose, подключаемся к базе данных, после чего прогоняем объект подключения через "конфигуратор" - созданный выше модуль mongoose-connect:
Переходим к модулю message - файл message.js.
Для того, чтобы отображать (я бы сказал мапить, но думаю русское слово "отображать" подойдет) сообщения на коллекцию messages, в которой хранятся сообщения чата, используем схему, которая также будет выполнять функции валидации данных.
После отображения получаем модель по имени Message, методы save() и find() которой сохраняют данные в коллекцию и извлекают данные из нее соответственно:
Приступаем к тестированию.
Запускаем сервер, пару клиентов:
Так как в "конфигураторе" - модуле mongoose-connect мы установили параметр debug равным true, в консоли сервера мы получаем весь расклад о работе модуля mongoose.
Начинаем общение:
Запускаем mongo shell, убедимся в том, что сообщения сохраняются в коллекции messages:
- db.messages.find()
Ну вот и все. Жду ваши лайки, дислайки (или как это все сейчас называется), замечания, предложения, и просто впечатления от этой серии постов, да и блога в целом.
На этом прощаюсь. Всем мир.
Для начала установим модуль Mongoose:
- npm install mongoose
Создадим модуль, назовем его mongoose-connect, в котором будем конфигурировать Mongoose - выводить в консоль сообщения в ответ на соответствующие события, а также валидно закрывать подключение в случае завершения работы приложения:
module.exports = function(mongoose) {
mongoose.set('debug', true);
mongoose.connection.on('connected', function () {
console.log('--- mongoose connected ---');
});
mongoose.connection.on('error', function (e) {
console.log('--- mongoose connection error ---\n%s', e.message);
});
mongoose.connection.on('disconnected', function () {
console.log('--- mongoose disconnected ---');
});
process.on('SIGINT', function() {
mongoose.connection.close(function () {
console.log('--- process terminated ---');
process.exit(0);
});
});
}
Редактируем код сервера - файл server.js - импортируем модуль mongoose, подключаемся к базе данных, после чего прогоняем объект подключения через "конфигуратор" - созданный выше модуль mongoose-connect:
var net = require('net');
var PubSub = require('./pubsub'),
pubsub = new PubSub;
var Message = require('./message'),
mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost:27017/test');
require('./mongoose-connect')(db);
var message = new Message(db);
net.createServer(function(socket) {
socket.setEncoding('utf8');
console.log('--- socket connected ---\nfrom: %s', socket.remoteAddress + ':' + socket.remotePort);
pubsub.emit('join', socket, function() {
message.get(null, function(err, data) {
if(err) return socket.write(err);
socket.write('\n' + data);
});
});
socket.on('data', function(data) {
data = data.replace(/\r\n$/, '');
console.log('--- socket data ---\n%s', data);
message.insert(this, data, function(err, data) {
if(err) return socket.write(err);
pubsub.emit('broadcast', socket, data);
});
});
socket.on('close', function() {
console.log('--- socket closed ---');
pubsub.emit('leave', this);
});
socket.on('end', function() {
console.log('--- socket end ---');
pubsub.emit('leave', this);
});
socket.on('error', function(e) {
console.log('--- server error ---\ncode: %s', e.code);
});
}).listen(8124, function() {
console.log('Chamber of Secrets is opened on port %d...', this.address()['port']);
});
Переходим к модулю message - файл message.js.
Для того, чтобы отображать (я бы сказал мапить, но думаю русское слово "отображать" подойдет) сообщения на коллекцию messages, в которой хранятся сообщения чата, используем схему, которая также будет выполнять функции валидации данных.
После отображения получаем модель по имени Message, методы save() и find() которой сохраняют данные в коллекцию и извлекают данные из нее соответственно:
module.exports = function(mongoose, len) {
var max = len || 100; // длина сообщения по умолчанию - 100 символов
var Schema = mongoose.Schema;
var msgSchema = new Schema({
data: {type: String, trim: true, validate: function(data) {
return data.length <= max;
}},
from: String, ts: Number
}, {capped: {size: 1000000, max: 20}});
var Message = mongoose.model('Message', msgSchema);
this.insert = function(client, data, cb) {
var msg = new Message({data: data, from: client['_id'], ts: Date.now()});
msg.save(function (err, msg) {
if(err) return cb('--- error inserting data ---');
cb(false, createMessage(msg));
});
}
this.get = function(n, cb) {
var i = n || 5; // количество сообщений по умолчанию - 5 штук
Message.find().sort({'$natural':-1}).limit(i).exec(function(err, items) {
if(err) return cb('--- error getting data ---');
cb(false, items.map(function(msg) {
return createMessage(msg);
}).reverse().join('\n'));
});
}
}
function createMessage(msg) {
return new Date(msg.ts).toLocaleTimeString() + ' ' + msg.from + ' >>> ' + msg.data;
}
Приступаем к тестированию.
Запускаем сервер, пару клиентов:
Так как в "конфигураторе" - модуле mongoose-connect мы установили параметр debug равным true, в консоли сервера мы получаем весь расклад о работе модуля mongoose.
Начинаем общение:
Запускаем mongo shell, убедимся в том, что сообщения сохраняются в коллекции messages:
- db.messages.find()
Ну вот и все. Жду ваши лайки, дислайки (или как это все сейчас называется), замечания, предложения, и просто впечатления от этой серии постов, да и блога в целом.
На этом прощаюсь. Всем мир.






Комментариев нет:
Отправить комментарий
Комментарий будет опубликован после модерации