• На каком фреймворке лучше писать блог (nodejs)?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Уже разобрано было тут: Сложно ли написать свой блог на nodejs?
    Ответ написан
    Комментировать
  • Как вытащить переменную за рамки функции в JavaScript?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Как раз этого делать не нужно. Вместо этого нужно понять идею асинхронного программирования. Все колбэки исполняются не по месту своего объявления, а тогда, когда к ним приходят данные, поэтому в Вашем примере кода сначала происходит console.log(items_list); а уже потом items_list = data И это хорошо, потому, что не происходит ожидания исполнения коллбеков, не происходит блокирования потока исполнения. Всю синхронную логику обработки полученных в коллбеке данных Вы можете написать прямо в коллбеке, а если нужно реализовать последовательный или параллельный вызов нескольких ассинхронных запросов (все, что связано с вводом/выводом, доступом к базе и файлам, например), то это можно сделать разными способами, самые популярные из них, это библиотека async и промисы. Я использую https://github.com/caolan/async Например:
    var async = require('async');
    var items_list, users_list;
    async.parallel([
        function(callback) { // делаем первый запрос к базе
          db.model('items').find({}, function (err, data) {
            items_list = data;
            callback(); // данные получены, возвращаемся
          });
        },
        function(callback) { // параллельно делаем второй запрос к базе
          db.model('users').find({}, function (err, data) {
            users_list = data;
            callback(); // данные получены, возвращаемся
          });
        }
    ],
    function() {
      // когда оба запроса уже завершены, то мы попадаем сюда
      console.dir({ items: items_list, users: users_list });
    });
    Ответ написан
  • Как сделать хранилище статики с помощью NodeJS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    // И для этого есть https://www.npmjs.com/package/mkdirp
    var mkdirp = require('mkdirp');
        
    mkdirp('/tmp/foo/bar/baz', function (err) {
        if (err) console.error(err)
        else console.log('pow!')
    });
    Ответ написан
    1 комментарий
  • Где папка с NodeJS на MacOS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Папку с проектом не нужно создавать в папке ноды, ее наоборот нужно создавать с своем личном каталоге, на рабочем столе, где Вам удобно. npm установит локальные пакеты в node_modules внутри папки проекта, а глобальные пакеты там, где нужно. Вам даже переживать об этом месте не придется.
    Ответ написан
    Комментировать
  • Какие компиляторы css2 sass,scss,less Вы знаете?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Я лично использую https://www.npmjs.com/package/node-sass он же на гитхабе https://github.com/sass/node-sass
    Это лучшее, что я смог найти. Хоть я не большой знаток и не большой любитель стилей или вообще браузерной верстки, но выбирать пакеты из npm приходится. Поэтому пару советов есть, чтобы исключить долгие страдания и сомнения, нужно принять систему формальных критериев и измеримых величин, все лучше, чем выбирать по смутным интуициям:
    1. Список претендентов можно сделать по поиску, статьям, Хабру, Стековерфлову и по вот этим ресурсам: nodeframework.com https://github.com/sindresorhus/awesome-nodejs https://github.com/vndmtrx/awesome-nodejs
    2. Сначала я сравниваю по количеству звезд в Github и NPM, по количеству скачиваний, по давности последнего коммита и их общему количеству, по контрибьюторам и тому, что делается в пулреквестах и ишьюсах (как быстро устраняются баги, реагируют ли разработчики на проблемы вообще, все это сразу видно). Нужно выявить дохлые проекты и их отбросить.
    3. Потом ставлю их себе и сравниваю исходники. Чем меньше размер исходников и приятнее стиль кода, тем лучше. Отбрасываю монстров, у которых огромные репозитории и сомнительный код. Оставляю самые лаконичные или даже минималистичные (люблю минимализм). Ну и, для этого конкретного случая нужно сравнить результаты и качество генерируемого css.
    4. После этого проверяю на скорость/производительность. Для чего нужно сделать тесты. В этом случае нужно взять пример файла scss стилей посложнее и прогнать его через каждую библиотеку по 1млн раз и сравнить цифры.
    Ответ написан
    Комментировать
  • Как можно подсчитать траффик для запроса (request)?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    sudo apt-get install nethogs
    или
    yum install nethogs
    Ответ написан
    Комментировать
  • Как разобраться с обозначениями версий в npm пакетах, со значками вроде: ~?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Комментировать
  • Как получить нужное значения нужного свойства в node?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Это называется проекция, т.е. можно указать какие поля возвращать:
    Data.find( { }, { name: 1, fieldName: 1, id: 0 } , function(err, arr) { ... });
    Ответ написан
  • Как сделать возможность изменения кода приложений без перезагрузки основного приложения nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Как автор упомянутого сервера приложений, проясню ситуацию. Все остальные приведенные решения перестартовывают процессы. В лучшем случае они запускаются в режиме нескольких процессов (при помощи cluster или используя child_process) и перестартовывают дочерние процессы (worker), а родительский процесс (master) следит за изменениями и не перестартовывает. Это действительно дает нулевой даунтайм, что важно для продакшена, но не особо важно для разработки. А важно другое - удаляются из памяти все данные, все развернутое там состояние, закрываются соединения с БД, выгружаются библиотеки, да и все, что было проинициализировано при старте приложения, все полностью разрушится и перезагрузится. В Impress же подгружаются отдельные файлы, заменяя на лету в памяти предыдущий код. Это делается без eval, при помощи vm. При многочисленных изменениях он понимает, что меняется много файлов (например заливается новая версия приложения) ждет, когда эта активность прекратится, а потом обновит все одним махом. При частых изменениях одного и того же файла, может сложиться ситуация, когда в памяти будут параллельно находиться 2-3 копии одного кода. Дело в том, что в систему идет поток запросов, и старые запросы еще были запущены в момент, когда была предыдущая версия, и они не успели завершиться. Поэтому, нужно дождаться их завершения, а для новых уже можно использовать новую версию кода. Там есть еще много особенностей, о которых долго рассказывать. В общем, мне не известны другие реализации этого решения. Если они таки найдутся, то пришлите на сравнение. Приведенная же статья несколько устарела, для первичного ознакомления берите эту: habrahabr.ru/post/247543
    Ответ написан
    Комментировать
  • Как правильно тестировать взаимодействия микросервисов?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Все это делается при помощи заглушек, которые вместо реализации отдают правдоподобные данные, просто захардкоженные. Сервисы, будь они хоть SOA, хоть микросервисами, они вообще не должны быть привязаны к портам. Сервис - это фасад, закрывающий от внешнего мира реализацию серверной логики, при запуске сервис из настроек берет порт, хост, адреса доступа к другим сервисам, и любые другие параметры. Для того, чтобы стартовать несколько сервисов на одной машине, имитировать серверное окружение, несколько серверов, можно использовать контейнеры docker или виртуальные машины. С разных портов сервисы можно объединять в один пучек при помощи nginx или другого реверс-прокси с URL-реврайтингом. Или есть вариант использовать сервер приложений, который скрывает от разработчика задачу запуска и объединения сервисов в один пучок.
    Ответ написан
    2 комментария
  • Правильно это когда "Stateful"?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    MVC это бред для SPA (одностраничных приложений), он не подходит для разработки сервера, когда сервер связывается с клиентом через API и обменивается данными в JSON (или другом формате). Может еще вот эти две мои лекция помогут https://youtu.be/Try7lmWikao и https://youtu.be/0oIiPJtfUpw Там не все по этой теме, но ответы на Ваши вопросы, надеюсь, есть.
    Ответ написан
    1 комментарий
  • Какие реализации балансировщиков нагрузки на NodeJS сейчас лучшие и насколько они адекватно работают?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Учитывать загрузку ЦП и ОЗУ обычно не нужно, это только для эзотерических задач. Для балансировки в рамках одной машины хватает рандомного раскидывания или приклеивания по IP (IP sticky) хватает библиотеки cluster (или более низкоуровневой child_process) для передачи хендлов сокетов из центрального процесса в дочерние через системный механизм IPC (interprocess communication) для обработки. Например, вот тут как я это делаю: /lib/impress.js#L636-L646 в Impress Application Server. Если выходить за рамки одной машины, то чисто нодовская балансировка не годится, нужно применять двухуровневую балансировку, хардварное решение типа F5 Load balancer + внутри машины еще и распределение между процессами через IPC. Софтварные балансировщики на ноде в режиме нескольких машин ни чем не лучше чем Reverse proxy, в этом случае nginx даст Вам лучшие результаты, чем нодовские решения, это точно, он может еще и терминировать SSL очень эффективно и дальше уже передавать в ноду просто HTTP, снижая нагрузку на нодовский сервер. Как на nginx, так и на хардварных решениях, вполне можно сделать любой URL-реврайтинг, стики и объединение нескольких сервосов и портов в один, но хардварные на порядок производительнее.
    Ответ написан
    4 комментария
  • Как перенастроить ошибки в nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    С одной стороны после необработанной ошибки оставлять в памяти процесс плохо, будут утечки памяти, испорченные данные и незавершенные обработчики могут привести к непредсказуемым последствиям. В этом случае многие рекомендуют перезапускать процесс при помощи менеджеров типа forever и не видит в этом ничего страшного. Я же считаю что не нормально когда процесс постоянно падает и перезапускаеься. Нужно все-таки искать ошибки исправлять их. Тем не менее редкие ошибки могут попадать конечно и в продакшен. Тут можно применять несколько уровней восстановления после ошибок: домены, о которых уже говорилось - для отлова асинхронных исключений, песочницы (sandbox) - для экранирования области памяти в которой происходит утечка в прикладном коде с удалением песочниц после критических исключений, критические секции - они в ноде нужны редко, т.к. не подходят для асинхронного кода, но все-таки иногда могут быть полезны. Все эти способы в комплексе я применил в сервере приложений Impress, если уже не прямо брать его, то исходники посмотреть не помешает: https://www.npmjs.com/package/impress
    Ответ написан
    Комментировать
  • Какие наборы паттернов применяются при написание апи чаще всего?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вот тут подробно расписываю как для API распространено применение не подходящих паттернов habrahabr.ru/post/204958 и как нужно делать.
    Ответ написан
  • Как поставить путь в vps?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Так и не должен, если pm2 или другой менеджер процессов ищет его в одном месте, где было указано при установке как сервис, то откуда он должен знать что появилась папка и файл ушел в нее.
    Ответ написан
  • Как исправить проблему с адресом?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Тут может быть разное, Вы можете слушать не внешний интерфейс, а 127.0.01, например, или фаервол может блокировать входящие подключения, или не тот порт, перепроверьте все. Выключите фаервол iptables stop, перепроверьте IP и порт, перезапустите приложение и попроверьте опять.
    Ответ написан
    Комментировать
  • Как реализовать node js на сайте?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Для shared-хостингов ни как. Для node.js нужно управляемый хостинг (VPS, collocation, dedicated) или специализированный node.js хостинг (nodejitsu и др.).
    Ответ написан
    3 комментария