• Как переделать приложение под использование нескольких конфигов?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Что вы понимаете под "использование рекурсивно"?
    2. Конфиги можно подгружать через require, readFile,
    3. Блюберд промисы уже давно не нужны, промисы в ноде есть нативные
    4. Зачем тут тайпскрипт в зависимостях, если приложение на js?
    5. Зачем в зависимостях библиотека для случайных чисел, если есть Math.random?
    6. Экспресс это фрактал говнокода и не должен быть использован ни где
    7. Везде по коду куча захордкоженных вещей, это ужасно
    8. В функциях изменяются значения аргументов, это ближайший путь к путанице
    9. Вот тут пример сервера с конфигами: https://github.com/HowProgrammingWorks/NodejsStarterKit
    Ответ написан
    Комментировать
  • Сколько стоит реализация проекта Impress Application Server для Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вопрос класса
    сколько стоит квартира?
    размеры? какая? где? У меня много студентов, в КПИ есть конструкторское бюро, разрабатывают на технологическом стеке Metarhia, частью которого и есть Impress.
    Ответ написан
    Комментировать
  • Как разбить большой файл в node.js на несколько поменьше?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Этот вопрос более общий, чем Ваш случай с node.js и даже более общий, чем JavaScript вообще. Хорошо разделить свой код на части, выделить абстракции, дать им названия и объединить их в одно целое - это одна из главных задач программиста на любом языке.

    Я сначала отвечу на частный вопрос по Node.js и JavaScript, а потом объясню эту тему глубже. Для Node.js есть require, при помощи которого можно импортировать из других модулей. Это реализация Dependency Lookup, т.е. мы имеем несколько модулей и каждый из них знает, от каких он зависит и может запросить менеджер зависимостей дать ссылку на то, что экспортирует другой модуль (в данном случае файл). Например, мы можем сделать require('./matrix.js') или require('./lib/matrix.js') и таким образом получим ссылку на то, что экспортирует matrix.js через module.exports = { ... };. Пример кода с импортом: names.js

    В этот самый module.exports мы отдаем ссылку на функцию ил на объект или массив, который содержит все, что мы хотим экспортировать (можно экспортировать и скалярное значение, но это практически не нужно). В подавляющем большинстве случаев экспортируют объект (используя его как справочник экспортируемых идентификаторов), чуть реже одну функцию (иногда фабрику или функцию обертку) или конструктор прототипа (или класса). Пример кода с экспортом: lib/submodule2.js

    Но можно импортировать зависимости целыми массивами, например тут: main.js Если посмотреть чуть шире ноды, на JavaScript, то есть способ импорта/экспорта через ключевые слова import и export. Примеры: import.mjs и export.mjs

    Документацию модно почитать тут:
    1. Модули для Node.js через require/module.exports: https://nodejs.org/api/modules.html
    2. Модули для Node.js через import/export: https://nodejs.org/api/esm.html
    3. Модули для JavaScript через import/export: https://developer.mozilla.org/en-US/docs/Web/JavaS... и https://developer.mozilla.org/en-US/docs/Web/JavaS...

    Но это все техническая реализация, гораздо важнее то, как мы разбиваем наш код на модули или абстракции. Тут нужно ввести понятие связывание и классифицировать методы связывания (частей кода):
    1. Через общие данные (самое жесткое связывание)
    2. Через вызовы (обычно между модулями с экспортом и импортом)
    3. Через события (самое легкое, между слабосвязанными программными компонентами)

    Если из разных функций, прототипов и классов (их методов) Вы обращаетесь к одним и тем же данным, а тем более, меняете их, то это очень плохо. Могут быть общие идентификаторы такие, но это только константы, которые не меняются из разных мест. Могут быть группы функций, которые должны видеть одну переменную и менять ее, но их нужно объединять друг с другом через замыкания и частичное применение. И такие, связанные через данные конструкции (сильно связанные) должны находиться только внутри одного файла. Изменение одних и тех же данных из разных мест, может привести к формированию сложного и непредсказуемого состояния, а в конечном итоге к ситуациям, когда комбинаторный взрыв состояния не может быть адекватно обработан программой, все случаи просто не покрыты условиями и мы даже не можем себе представить и учесть в коде все случаи.

    Вызовы - это гораздо более безопасный способ взаимодействия программных компонентов, поэтому мы используем его для интерфейса между модулями и между классами и прототипами. Мы экспортируем/импортируем коллекции функций (API) или коллекции классов, что предполагает, что все взаимодействие между ними будет через вызовы (даже обращение к свойствам может быть перехвачено геттерами и сеттерами). Об этом способе связывания модулей я уже выше много сказал.

    Наименее жесткий способ связывания - через события. Тут один программный компонент (модуль, класс, прототип, функтор) может подписаться на события другого или вызывать события у себя или в другого не ожидая, что там есть подписчики. Конечно тут могут быть проблемы с контрактами событий, т.е. именами и форматами данных, они все указаны не жестко и тут может быть много ошибок. Это очень гибкий способ, но он таит в себе потенциальные проблемы совместимости. Так что, где можно обойтись вызовами, то лучше не использовать события.

    Есть еще один средний способ между вызовами и событиями, это callback (и listener). При помощи него события и сделаны, практически, в метод .on(name, callback) (или его аналоги) передается функция callback в качестве аргумента. На этом способе построено асинхронное программирование, в том числе такие способы связывания, как асинхронная последовательная композиция и асинхронная параллельная композиция функций, чеининг и промисы.
    Ответ написан
    1 комментарий
  • Какую книжку выбрать для изучения JS?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Комментировать
  • Как выполнять деплой приложений impress?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    При изменении конфигов нужно перезапускать приложение, это можно делать через командную строку impress stop и impress stop

    А вот access.js должен подхватываться автоматически. Присылайте не работающий пример сюда: https://github.com/metarhia/Impress/issues
    Ответ написан
    Комментировать
  • Зачем нужен master server в impress?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    В Impress каждый процесс имеет свой открытый порт отдельный, это нужно для того, чтобы к нему можно было подключаться не через мастер-процесс, а напрямую. Вообще межпроцессовое взаимодействие в Impress есть, дочерние процессы подключаются по TCP к мастер-процессу для того, чтобы он обеспечивал синхронизацию данные, трансляцию событий и управление ими всеми. Но вот клиентские подключения через мастера не проходят, а идут сразу в воркеры. В примере www это http сервер на 80 порту, rpc это jstp сервер на 3000 порту. Что такое JSTP можно почитать тут: https://github.com/metarhia/JSTP и еще вот эту статью почитать или послушать: https://habrahabr.ru/post/306584/
    Ответ написан
  • Return выполняется раньше получения данных с помощью request, как побороть?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Почитайте про асинхронное программирование в Node.js. Все функции, которые содержат асинхронный ввод/вывод должны быть асинхронными, т.е. возвращать значения через callback, а return вообще им не нужен. Примерчики посмотрите: https://github.com/HowProgrammingWorks/Asynchronou... и тут https://github.com/DzyubSpirit/Asynchronous-Javascript там есть много с гетами страниц.
    Ответ написан
    Комментировать
  • Как найти все запущенные node серверы в локальной сети?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Это все равно, что спросить "Как найти все файлы, написанные блондинами?"
    Ответ написан
    Комментировать
  • Как исправить проблему с node?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Это не проблема, сообщение не мешает, но если не хочется его видеть, то ставьте наоборот более старую верси ноды 5.x
    Ответ написан
    3 комментария
  • В последней версии Node.js для норм сборки модулей не нужен Python и Компилятор MS?

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

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Задачи по времени нельзя запускать в мастере, если они свалятся, то свалится все, лучше запусать задачи в воркерах
    2. Очень не рекомендую использовать библиотеку cluster, это один их худших кусков кода ноды, используйте child_process вместо cluster
    3. Из воркера, который делает задачи по времени, информацию можно отправлять в мастер, а другие воркеры могут ее забирать, для этого есть IPC:
    3.1. Для отправки сообщений из мастера в воркеры: https://nodejs.org/api/child_process.html#child_pr...
    3.2. Для отправки воркеров в мастер: https://nodejs.org/api/process.html#process_proces...
    4. Вместо IPC рекомендую использовать TCP сокеты, но если задача не требует больших нагрузок, то и IPC сгодится, он проще
    Ответ написан
    Комментировать
  • Имеет ли смысл WebSockets?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Если админка веб, то конечно вебсокеты. По одному вебсокету можно параллельно отправить на сервер сколько угодно запросов, а вот для http параллельно только 6 запросов. Кроме того, http открывает новые соединений для новых параллельных запросов, а вебсокеты позволяют все делать через одно, в асинхронном стиле. Еще по вебсокетам сервер без всякого запроса со стороны клиента всегда может вытолкнуть пакет данных (например с событием в виде сериализованного объекта). Взаимодействие двухстороннее, с установлением соединения, не блокирующее. В общем, если нет ни каких причин не использовать вебсокеты, то их нужно использовать. Единственная существенная причина их не использовать, это если клиент не веб, тогда можно использовать просто TCP сокеты.
    Ответ написан
    Комментировать
  • Почему сluster не уменьшает время загрузки?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Кластер и не должен уменьшать время загрузки. Его задача - поднять общую производительность rps (request per second). Как он работает, соединение устанавливается с мастером и потом сокет передается через IPC в воркер для обработки. Если каждое соединение делает нечто более трудоемкое, чем отдача строки, то это позволит утилизировать под задачу доп. ядра, но для Вашего случая, накладные расходы на IPC компенсируют распараллеливание обработки. Кроме того, IPC сам по себе не быстрый, и cluster - это кусок говнокода, из встроенных библиотек ноды хуже написана только http. Я убрал cluster из своих проектов и готовлюсь убрать http.
    Ответ написан
    Комментировать
  • Какой open source проект на node.js выбрать как эталон для архитектуры и стиля?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    До этого поделайте лабы на nodeschool.io и у меня на https://github.com/HowProgrammingWorks
    Потом изучайте исходный код ноды для вникания в стиль: https://github.com/nodejs/node/tree/master/lib и уж потом проект.
    Ответ написан
    2 комментария
  • Высоконагруженные системы, каковы принципы разработки?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Про cgi, python, php, apache нужно сразу забыть. Лучше забыть и про http и вебсокеты. А смотреть на C/C++, node.js, Go, in-memory базы данных, TCP сокеты.
    Ответ написан
  • Стоит заниматься такой оптимизацией?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Имеет смысл делать 1 процесс, конекшен пул к БД из 20-30 соединениями, асинхронный код, и переиспользование соединений, потому, что одно соединение умеер выполнять один SQL одновременно и будет блокировать остальных, нужно поиграться к кол-вом соединений в пуле.
    Полезные ссылки:
    https://www.npmjs.com/package/mysql#pooling-connections
    https://www.npmjs.com/package/mysql-utilities
    Ответ написан
  • Как сделать так чтобы сервер на node.js не зависал?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Ну тут могут быть разные причины:
    1. Проверьте, не утекает ли память, потому, что процессы часто виснут без всяких сообщений от утечек
    2. Замените библиотеку cluster на child_process, у cluster большие проблемы с надежностью, виснет
    3. Перейти на нормальные дрова к постгресу: https://www.npmjs.com/package/pg
    4. Использовать пул соединений https://www.npmjs.com/package/pg#client-pooling
    5. Рассмотреть возможность перекладывания базы в память при старте и отдачи из памяти, если база не большая
    6. Не использовать принцип middleware и фреймворки на его основе типа connect, express, koa
    7. Проанализировать код на callback цепочки, может оказаться, что в каких-то ветках нет возврата
    Ответ написан
  • Как генерировать динамический html с помощью node js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Кешировать в оперативке по ключу и отдавать из кеша, ключом брать URL (для общедоступных ресурсов) и URL+UserId (для ресурсов пользователя). Кроме этого, не обращаться к БД при каждом запросе, не обращаться к диску при каждом запросе, писать хороший асинхронный код.
    Ответ написан
    5 комментариев
  • Что, помимо основ JS,необходимо знать и понимать для изучения Node.JS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Посмотрите план переподготовки с фронтенда на ноду: https://github.com/HowProgrammingWorks/Letters/blo...

    И экзаминационные вопросы по предмету "Архитектура ПО", который я читаю на примерах ноду:
    https://github.com/HowProgrammingWorks/Letters/tre...
    Ответ написан
    3 комментария
  • Можно ли как то записывать в определённое место в файле на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    fs.write(fd, data[, position[, encoding]], callback)

    https://nodejs.org/api/fs.html#fs_fs_write_fd_data...
    Ответ написан
    Комментировать