Сообщение от St_AnGer
С асинхроном у меня плохо, согласен. Пользовался им только для Ajax и то в простой форме - запрос сделали, потом когда то пришёл ответ и отреагировали асинхронно на него.
|
Привыкнешь, и потом будешь использовать "силу асинхронности" в свою пользу.
Сообщение от St_AnGer
В таком случае надо их генерировать самому? Просто не копал в эту сторону пока что, использовал что есть. ObjectID на данный момент мне не понравились своей нечитабельностью.
|
ObjectID имеет выгоду тем что он гарантированно уникален при наличии нескольких баз данных (кластеризация). Но это также обходиться и вообще редко нужно. Я использую отдельную коллекцию, с ID - именем коллекции которой генерим ID, и value - увеличивающимся числом.
Код простой - атомарный запрос с увеличением счетчика. Также вставит новую запись если ее уже нету:
db.collection('ids').findAndModify({
_id: 'users'
}, { }, {
$inc: {
value: 1
}
}, {
upsert: true,
new: true
}, function(err, item) {
if (err) return next(err)
id = item.value;
// ...
});
Вот тебе счетчик, который убедится что не будет повторений, даже если много процессов вставляют записи в одну бд.
Сообщение от St_AnGer
Вот собственно и хотел после "перевода" сервера (с PHP+MySQL на node.js+mongodb, благо реализовано пока что всего 15 только самых нужных API, реализую их постепенно по мере модификации грубого наброска веб-чатика для первой версии сервера) заняться pagination, потому что с проблемой её отсутствия уже сталкивался при первом подходе к чату.
|
pagination на самом деле просто делается.
Я использовал middleware паттерн у express'а для этого.
В общем запросы: app.get('/path', middlewareA, middlewareB, ..);
Идея в том что middleware может быть сколько угодно, и они будут запускаться по очереди. Чтобы соблюдать очередь уважая возможную асинхронность в них, нужно самому вызывать next метод в каждом middleware. При этом можно вызвать next(new Error('...')); что закончит очередь, и вызовет middleware для ответа с ошибкой.
Это удобно как в примере выше я привел для аутентификации например.
Также и для pagination.
Можно сделать что-то типо:
var pagination = function(args) {
args = args || { };
args.skip = args.skip || 0;
args.limit = args.limit || 16;
if (args.sort) {
var key = args.sort;
args.sort = { };
args.sort[key] = args.order || -1;
} else {
args.sort = { _id: -1 };
}
return function(req, res, next) {
var obj = { };
obj.skip = parseInt(req.query.skip, 10);
if (isNaN(obj.skip))
obj.skip = args.skip;
obj.limit = parseInt(req.query.limit, 10);
if (isNaN(obj.limit))
obj.limit = args.limit;
obj.sort = args.sort;
req.pagination = obj;
next();
}
};
app.get('/friends',
userAuth({ // auth
fields: [ 'friends' ]
}),
pagination({ // pagination
sort: 'name',
order: -1,
skip: 0,
limit: 16
}),
function(req, res, next) { // route controller
if (req.user.friends.length) {
db.collection('users').find({
_id: {
$in: req.user.friends
}
}, {
fields: {
name: 1
}
})
.sort(req.pagination.sort) // there needs to be a sorting
.skip(req.pagination.skip) // how many items to skip
.limit(req.pagination.limit) // how many to return
.toArray(function(err, items) {
if (err) return next(err);
res.json(items);
});
} else {
res.json([ ]);
}
}
);
И этот middleware можно переиспользовать в других API запросах естественно.
Сообщение от St_AnGer
Вот прям в точку. Просто хочется (мне самому от себя) чтоб было сделано ещё вчера, поэтому спешу, лечу и пропускаю повороты. Из за этого часто возвращаюсь назад. Есть такая проблема у меня, трудно с этим спорить. Борюсь с ней потихоньку . Дело ещё и в том, что на пыхе всё что нужно на данном этапе могу реализовать сходу, а вот на js "влоб" не получается. Языки то, по сути и подходу к ним - разные. И как бы получается что "я хочу, я могу, я умею, но не этой отвёрткой и не этот шуруп". Не сошлось, короче . Ну это ничего, свыкнусь, освоюсь.
|
Да мне тоже так хочется часто, жаль что приходится постепенно
Сообщение от St_AnGer
За код спасибо, он для меня местами выглядит страшно, но вполне читаемо и понятно. Меня прёт в "реляционность", хоть тресни. Ещё не освоился с удобствами монги, поэтому сделал отдельную коллекцию friends со связками (users связаны с users в отношении многие-ко-многим через коллекцию friends), заместо того, чтобы хранить список id друзей у самого пользователя. Меня несёт не туда, а нода и монга попутно ещё и ломают мои взгляды на программирование в целом .
|
Вот то что ломаются взгляды на кодинг - это круто. Т.к. это значит ты вылезаешь из рамок одного типа языков. Что в результате лишь расширит твое мышление как разработчика, и ты будешь думать не языками, а более абстрактно как программист. Что дает возможность подходить к задаче более рационально, используя нужный инструмент.
В будущем выучить новый язык для тебя не составит труда вообще.