Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В MongoDd придётся это отслеживать рукамиА вот и неправда. В mongoDB для данных можно задавать как время жизни, так и максимальный размер коллекции.
.Контроллер, при необходимости, вызывает методы модели, которые получают данные из MongoDb или Memcached. Когда все данные для ответа готовы, контроллер даёт команду шаблонизатору на формирование страницы и отправляет сгенерированный html пользователю.
var hub = require('hub');
/* Тут инициализируются другие объекты нужные модулю, убрал для краткости */
var collection = new hub.mongodb.Collection(hub.mongodbClient, 'message');
/* Тут расположены остальные методы этой модели */
module.exports.findDiscussed = function(page, cb) {
collection.find({isPublished: true, type: 0, replies: {$ne: 0}}, function(err, cursor) {
cursor.sort({replyDt: -1}).limit(hub.config.app.perPage).skip(page * hub.config.app.perPage);
cursor.toArray(function(err, messages) {
cb(err, messages);
});
});
};
/* И тут тоже */
Я для этого использую globals.Зачем???
jQueryв node.js? Кажется, я чего-то не понимаю в этом мире.
тех что не хватает взять из языка по умолчанию
Для крупных проектов, естественно, нужна какая-то своя система, учитывающая особенности проекта, но тут-то речь о небольших (по функциональности\команде разработчиков) сервисах.
async.parallel({
questions: function(cb) { messageModel.findByTag(tag, page, getQuestions(res, cb)); },
info: function(cb) { messageModel.countByTag(tag, getInfo(req, page, cb)); }
}, function(err, results) {
/* Тут я имею в переменной results 2 поля questions и info с готовыми данными или в err ошибку произошедшую во время выполнения */
});hub.router.app('/news/:category/:year/full/:id', function(req, res, next) {
// Сюда будет передано управление для обработки нашего урл.
// В req.params.id будет id новости. Соответственно и другие параметры там же.
});actions = url.split('/');
myFunctions(actions[0]);/news/<category>?year=<year> либо /news?category=<category>&year=<year>/news/<news_id>global?classes.Some = new Class();
classes.Some.prototype =
{
_init: function(){},
...
}
// где угодно
var some_var = new classes.Some();
С удовольствием почитаю о том, как вы видите правильную структуру приложения. А конкретнее следующие моменты: доступ к конфигурации приложения из любой его точки (контроллеры, модель, фильтры (выполняемые до или после контроллеров), таски. Доступ к пулу заранее открытых соединений с кешем и базой данных из любой модели. Доступ к мультиязычным строкам из контроллеров и шаблонов. И т.д.
Когда количество текстов ошибок будет приближаться к сотне
var form = require('form');
// Свой фильтр в формате node-validator
filterToUpperCase = function() {
this.modify(this.str.toUpperCase());
return this.wrap(this.str);
};
var fields = {
name: [
form.filter(form.Filter.trim), // Применяем встроенный в node-validator фильтр trim
form.filter(filterToUpperCase), // Применяем свой фильтр
form.validator(form.Validator.notEmpty, 'Empty name'),
form.validator(form.Validator.is, /[0-9]+/, 'Bad name')
],
text: [
form.filter(form.Filter.trim),
form.validator(form.Validator.notEmpty, 'Empty text'),
form.validator(form.Validator.len, 30, 1000, 'Bad text length')
]
};
var textForm = form.create(fields);
textForm.process({'text' : 'some short text', 'name': ''}, function(error, data) {
console.log(error);
console.log(data);
});
Разработка WEB-проекта на Node.JS: Часть 2