• Контейнеризация процесса разработки и деплоя?

    undassa
    @undassa
    Last.Backend
    Привет! Мы как раз в Last.Backend делаем такое решение. В ближайшие дни планируется большое обновление, но и сейчас можно почти все описанные задачи решить. Если что можете написать мне, я дам всю информацию.
    https://lastbackend.com
    Ответ написан
  • Как обработать динамические таблицы с правильной выгрузкой данных?

    undassa
    @undassa
    Last.Backend
    попробуйте сделать объект содержащий все возможные поля таблицы:
    var etalon = {
       type: '',
       engine: '',
       date : ""
    }


    затем берёте неполный объект что у вас есть, например
    var car = {
       type: 'tesla',
       date : '01.11.2014'
    }


    и делаете новый объект с наследованием (например через библиотеку lodash):

    var a = _.extend({},etalon,car);
    
    console.log(a);
    /*
    {
       type: 'tesla',
       engine: '',
       date : "01.11.2014"
    }
    */


    получите необходимый вам объект, где не заполненные поля будут заполнены по default значениям.
    Ответ написан
    Комментировать
  • Чат и не прочитанные сообщения пользователя, как правильно спроектировать БД?

    undassa
    @undassa
    Last.Backend
    Для хранения недоставленный сообщений целесообразнее использовать redis и сделать это следующим образом:

    Если пользователь в данный момент не онлайн, записывать сообщения в редис через rabbtimq (ZeroMQ) специальными воркерами. Тогда удастся размазать нагрузку и не будет пиков.

    Так же желательно все сообщения для конкретного пользователя хранить в его "личном" списке, а не списке комнаты, тогда есть возможность (при необходимости) при успешном получении - очищать кеш и redis не будет раздуваться.

    Если же необходимо хранить историю сообщений - желательно написать воркер, который раз в n секунд будет забирать данные из кеша и записывать в БД в отдельную коллекцию или таблицу, и так же очищать кеш.

    При подключении пользователя просто делать запрос на получение недоставленных сообщений из кеша, если кеш пуст - загрузить из БД из специальной таблицы недоставленных.

    Зачем нужна отдельная таблица (коллекция) - так как непрочитанные сообщения - данные, находящиеся постоянно в работе - данная таблица не будет постоянно увеличиваться в размерах (будет, но существенно медленнее, ведь её так же надо очищать), соответственно выборка по данной таблице с учетом индексации будет гораздо быстрее.

    Успехов :)
    Ответ написан
    Комментировать
  • Как вы организуете ваши nodejs приложения?

    undassa
    @undassa
    Last.Backend
    Странно что никто не предложил вам посмотреть в сторону yeoman генератора.
    На данный момент ребята как раз стараются создать эталон организации приложений на ноде и других языках.

    В наших приложениях мы используем примерно следующую структуру:
    ├── Gruntfile.js
    ├── app.js
    ├── config
    │   ├── config.js
    │   └── env
    │       ├── all.js
    │       ├── development.js
    │       ├── production.js
    │       └── staging.js
    ├── package.json
    ├── src
    │   ├── controllers
    │   │   └── controller.js
    │   ├── lib - общие самописные библиотеки для всего приложения (например описание ошибок, логи и т.п.)
    │   │   ├── error.js
    │   │   ├── logger.js
    │   │   └── routes.js
    │   ├── modules - законченные модули
    │       └── module.js
    │   └── models - модель данных
    │       └── model.js
    └── templates
    │       └── template.html
    Ответ написан
    Комментировать
  • Как правильно использовать ООП в JavaScript?

    undassa
    @undassa
    Last.Backend
    Посмотрите как реализовано создание в JS класса из CoffeeScript.
    Используйте prototype

    И да, нет тут смысла даже думать про фреймворки.
    Ответ написан
  • Какие языки помогут лучше всего понять указатели и рекурсии?

    undassa
    @undassa
    Last.Backend
    Указатели - Си
    Рекурсии - Erlang, особенно как сделать там подобие цикла
    Ответ написан
    Комментировать
  • Как изменить css одного div при наведении на другой с javascript?

    undassa
    @undassa
    Last.Backend
    $('.notsun a').on('mouseover', function(){
      $('.daddy a').css('background-color','red');
    })


    как то так.. насчет селектора могу ошибаться, так что лучше проверить в документации jQuery.
    Ответ написан
  • За какое время можно изучить javascript?

    undassa
    @undassa
    Last.Backend
    Сам язык программирования, семантику и прочее. Работу с памятью, событийное программирование и прочим можно изучить за недельки 2. Ну подводные камни - еще пару недель, и то зависит от того клиентская разработка или серверная.

    Другое дело, что в основном надо знать популярные библиотеки для этого языка.
    На изучение того же Angular потребуется времени даже больше, а есть например серверные: Express, Mongoose..

    Сам язык быстро, но дело не в нём :)
    Ответ написан
    2 комментария
  • JS. Скрипт некорректно работает во втором запуске. Чего не хватает в коде?

    undassa
    @undassa
    Last.Backend
    Самое банальное решение повесить 2 различных обработчика.
    Не очень хорошо загонять создание обработчика в теле другого обработчика. Я сходу не разглядел причину, но постоянно вешать событие, не очень хорошо.

    Советую так же проверить удаляется ли класс 'map-close'.
    Успехов)
    Ответ написан
    Комментировать
  • Адекватно ли использовать nodejs сервер для приема платежей?

    undassa
    @undassa
    Last.Backend
    Поддерживаю. Сами пишем только на node.
    В большинстве современных платёжных систем доступное API, а большое комьюнити node, уже понаписало всевозможных модулей к ним. Так что используйте смело, но проверяйте.
    Ответ написан
    Комментировать
  • Как дождаться выполнения асинхронного метода?

    undassa
    @undassa
    Last.Backend
    Есть вариант использовать вместо обычного цикла - Array.pop().
    Алгоритм следующий:

    var a = [1,2,3];
    
    var magic = function () {
      var i = a.pop();
    
      if(!i) return false;
    
      // some magic with i
      console.log(i);
      
      magic();
      return true;
    }
    
    magic();


    Очень грубый пример, но жизнеспособный. Так же можно это обернуть в события и дергать события.
    Ответ написан
    Комментировать
  • Как масштабировать чат написанный на socket.io/nodejs?

    undassa
    @undassa
    Last.Backend
    io.on('connection', function (socket) {
    //
    });


    Данное событие сработает при успешном создании постоянного соединения между клиентом и сервером.
    Так как сокет соединение - это соединение в единственном экземпляре, то оно попадёт либо на 1й инстанс либо на 2й инстанс. И данное событие сработает либо тут либо там.

    Если уж вам по какой то причине необходимо увидеть в консоли событие подключения в обоих инстансах,
    я бы попробовал следующее:

    1. Использовал бы в качестве канала между инстансами нативный модуль redis.
    2. При успешном подключении послал бы в канал redis.publish уведомление по новом подключении

    НО! Необходимо вручную определять события которые надо прикидывать на второй инстанс, иначе от такого масштабирования нет толку, потому что оба инстанса будут обрабатывать одни и теже команды.

    Резюмируя: В этом нет смысла. Если есть необходимость - надо просто через редис уведомить второй сервис.
    Ответ написан
    2 комментария
  • Nodejs Mongoose update двух документов?

    undassa
    @undassa
    Last.Backend
    По порядку:
    var postId = req.body.id; - body может равняться null - тогда приложение упадёт. Необходима проверка.

    if (req.user) - не совсем корректная проверка, так как далее вы делаете запрос по вложенному полю id, которого может и не быть. А если его нет, то и нет смысла нагружать приложение лишним запросом в БД.

    if(req.user && req.user.id) - более грамотный вариант.

    Далее: всё верно, одним запросом конечно обновить 2 документа в разных коллекциях нельзя. Но я в вашем случае не вижу смысла использовать библиотеку async. Гораздо более идеологически правильным вариантом освоить событийное программирование. И просто вызывать последовательность событий при выполнении алгоритма.

    var error = function (err) {
       //
    }
    event.on('error', error);
    
    // где то там в глубине кода
    if(err)  return event.emit('error', err);
    event.emit('user save') // в случае отсутсвия ошибок


    Могу более подробно прокомментировать если надо :)
    Ответ написан
    Комментировать
  • Как загнать node на хостинг?

    undassa
    @undassa
    Last.Backend
    Можете попробовать сервис Last.Backend. С помощью конструктора визуально создать необходимую инфраструктуру... Всё подробно описано в User Guide, как раз на примере деплоя node.js приложения. Сайт проекта http://lastbackend.com, User Guide - docs.lastbackend.com/guide.
    Ответ написан
    Комментировать