Показать сообщение отдельно
Старый 22.10.2015, 13:59   #22
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Чат: PHP + MySQLi или что то другое?

Сообщение от St_AnGer Посмотреть сообщение
С асинхроном у меня плохо, согласен. Пользовался им только для Ajax и то в простой форме - запрос сделали, потом когда то пришёл ответ и отреагировали асинхронно на него.
Привыкнешь, и потом будешь использовать "силу асинхронности" в свою пользу.


Сообщение от St_AnGer Посмотреть сообщение
В таком случае надо их генерировать самому? Просто не копал в эту сторону пока что, использовал что есть. ObjectID на данный момент мне не понравились своей нечитабельностью.
ObjectID имеет выгоду тем что он гарантированно уникален при наличии нескольких баз данных (кластеризация). Но это также обходиться и вообще редко нужно. Я использую отдельную коллекцию, с ID - именем коллекции которой генерим ID, и value - увеличивающимся числом.
Код простой - атомарный запрос с увеличением счетчика. Также вставит новую запись если ее уже нету:
db.collection('ids').findAndModify({
    
_id'users'
}, { }, {
    
$inc: {
        
value1
    
}
}, {
    
upserttrue,
    new: 
true
}, function(erritem) {
    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: -};
    }

    return function(
reqresnext) {
        var 
obj = { };

        
obj.skip parseInt(req.query.skip10);
        if (
isNaN(obj.skip))
            
obj.skip args.skip;

        
obj.limit parseInt(req.query.limit10);
        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,
        
skip0,
        
limit16
    
}),
    function(
reqresnext) { // route controller
        
if (req.user.friends.length) {
            
db.collection('users').find({
                
_id: {
                    
$inreq.user.friends
                
}
            }, {
                
fields: {
                    
name1
                
}
            })
            .
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(erritems) {
                if (
err) return next(err);
                
res.json(items);
            });
        } else {
            
res.json([ ]);
        }
    }
); 
И этот middleware можно переиспользовать в других API запросах естественно.

Сообщение от St_AnGer Посмотреть сообщение
Вот прям в точку. Просто хочется (мне самому от себя) чтоб было сделано ещё вчера, поэтому спешу, лечу и пропускаю повороты. Из за этого часто возвращаюсь назад. Есть такая проблема у меня, трудно с этим спорить. Борюсь с ней потихоньку . Дело ещё и в том, что на пыхе всё что нужно на данном этапе могу реализовать сходу, а вот на js "влоб" не получается. Языки то, по сути и подходу к ним - разные. И как бы получается что "я хочу, я могу, я умею, но не этой отвёрткой и не этот шуруп". Не сошлось, короче . Ну это ничего, свыкнусь, освоюсь.
Да мне тоже так хочется часто, жаль что приходится постепенно

Сообщение от St_AnGer Посмотреть сообщение
За код спасибо, он для меня местами выглядит страшно, но вполне читаемо и понятно. Меня прёт в "реляционность", хоть тресни. Ещё не освоился с удобствами монги, поэтому сделал отдельную коллекцию friends со связками (users связаны с users в отношении многие-ко-многим через коллекцию friends), заместо того, чтобы хранить список id друзей у самого пользователя. Меня несёт не туда, а нода и монга попутно ещё и ломают мои взгляды на программирование в целом .
Вот то что ломаются взгляды на кодинг - это круто. Т.к. это значит ты вылезаешь из рамок одного типа языков. Что в результате лишь расширит твое мышление как разработчика, и ты будешь думать не языками, а более абстрактно как программист. Что дает возможность подходить к задаче более рационально, используя нужный инструмент.
В будущем выучить новый язык для тебя не составит труда вообще.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (22.10.2015)