• Где взять пример long-polling сервера на Node.js по образу и подобию Tornado?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Знакомство с node.js нужно начать с его основ, а не врезаться сразу в прикладную тему, потому, что в результате Вы начнете говнокодить, не понимая концепции разработки. Вот так по верхам хватать, это очень вредно, потому все равно будете весь код переписывать и ругаться. И уже с этого начали, например, ни какого лонг-пулинга Вам делать не нужно, а нужно SSE или WebSocket, для чего есть библиотеки ws, websocket, sse и другие. А вот приступать к их освоению я советую тогда, когда Вы проверите свои знания, например, тут nodeschool.io это поможет самостоятельно адекватно оценить свои силы.
    Ответ написан
    2 комментария
  • Как правильно искать по npmjs.com?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    К сожалению, только гугл, в полуручном режиме что-то отобрать, ну и списки:
    https://github.com/vndmtrx/awesome-nodejs
    https://github.com/sindresorhus/awesome-nodejs
    nodeframework.com
    Ответ написан
  • Есть ли Keylogger для Node.JS?

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

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Идея/концепция к проектированию не относится, это отдельный предварительный этап. Для проектов побольше, и в общем случае, проектирование включает такие шаги, многие из которых, конечно, можно пропустить или сократить до минимума, если задача не сложная:
    1. Системный анализ и изучение предметной области
    2. Формирование требований к разрабатываемой системе
    3. Архитектуная задача, которая сводится к простой формуле: разделять, называть и связывать подсистемы
    3.1. Декомпозиция сложных задач
    3.2. Слои (построение слоев абстракций)
    3.3. Планирование топологии системы, программной и серверной инфраструктур
    3.4. Решение вопроса интеграции подсистем, программные интерфейсы, контракты и связывание
    3.5. Интеграция с унаследованными приложениями
    3.6. Минимизация изменений, для случаев, когда постоянно происходят изменения в предметной области
    4. Выбор инструментов решения
    4.1. Выбор парадигм программирования и языков
    4.2. Выбор технологий и платформ
    4.3. Выбор моделей данных, алгоритмов и библиотек
    4.4. Выбор топологий и протоколов
    4.5. Выбор паттернов программирования
    5. Предварительные исследования
    5.1. Проверка гипотез, эксперименты
    5.2. Изучение особенностей технологий
    5.3. Прототипирование
    6. Задачи обеспечения надежности
    6.1. Планирование безопасности и защиты от несанкционированного доступа
    6.2. Планирование отказоустойчивости
    6.3. Планирование мер по обслуживанию системы в режиме эксплуатации
    6.4. Задачи высоких нагрузок, балансировки и масштабирования, если таковые предполагаются
    7. Организация процесса разработки
    7.1. Жизненный цикл программной системы
    7.2. Конвенции кода, соглашения и стандарты
    7.3. Оценка необходимых временных и финансовых ресурсов для разработки системы
    7.4. Календарный план
    7.5. Анализ и минимизация рисков, выявление слабых мест технологий и коллектива
    7.6. Закрепление принципов управления процессом разработки и корректировки задания в процессе
    8. Сборка технического задания из результатов всех предыдущих пунктов
    Ответ написан
    2 комментария
  • Как задать формат вывода чисел с плавующей точкой в JSON.stringify?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Это делать не нужно, все форматирование и украшательства нужно производить при ввводе на экран, потому, что не значащие разряды все равно будут игнорироваться парсерами, и нет разницы, бужет ли в json написано 0.02 или 0.020. Если хотите потом считать именно 0.02, то записывайте строку, а не число.
    Ответ написан
    2 комментария
  • Можно не использовать шаблонизатор для NodeJS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Шаблонизаторы нужны только если Вы делаете индексируемые страницы типа информационного сайта или блога, нода это делать может, но это не ее профиль, для веб-приложений это плохая привычка. Если у Вас приложение, то сделайте его одностраничным SPA, на сервере отдавайте корневую страницу и AJAX API, а на клиенте - забирайте JSON и в соответствии с данными модифицируйте DOM страницы. Для браузерной стороны посмотрите React и WebComponents.
    Ответ написан
    Комментировать
  • В каких ситуациях используется шаблон фабрика в Javascript?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Вот три основных способа использования фабрик в JavaScript:

    Фабрика объектов
    // Объявление фабрики объектов
    function Idiot(name) {
      return { name: name };
    }
    // создание экземпляра объекта
    var idiot1 = Idiot('Bill');
    console.dir(idiot1);

    Фабрика классов
    // Объявление фабрики классов
    function PhilosophySchool(schoolName) {
      return function Philosopher(name) {
        return { name: name, school: schoolName };
      };
    }
    
    // Создание класса
    var Stoicism = PhilosophySchool('Stoicism');
    var philosopher = Stoicism('Marcus Aurelius');
    console.dir(philosopher);

    Фабрика прототипов
    // Объявление базового прототипа
    function Engineer(specialization) {
      this.specialization = 'Software';
    };
    
    Engineer.prototype.getName = function() {
      return this.specialization + ' engineer ' + this.name; 
    }
    
    // Объявление фабрики
    function University(specialization) {
      function factoryConstructor(name) {
        this.name = name;
      };
      factoryConstructor.prototype = new Engineer(specialization);
      return factoryConstructor;
    }
    
    // Создание конструктора инженеров-программистов
    SoftwareEngineer = University('Software');
    
    // Создание экземпляра инженера-программиста
    var alex = new SoftwareEngineer('Alex');
    console.dir(alex.getName());
    Ответ написан
    Комментировать
  • С чем связано падение сервера websocket?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Проблема в том, что Вы не проверяете, живо ли соединение, перед тем, как послать в него данные. Для нахождения проблемы не хватает глубины вывода стека, добавьте ключик при запуске ноды node --stack-trace-limit=1000 application.js и там будет видно и из какого места Вашего кода это вызывается. Нужно ловить ws.on('close', fn) и ws.on('error', fn) и удалять эти сокеты из множества, по которому Вы проходитесь в цикле и рассылаете, дополнительно можно и проверку поставить типа if (connection.readyState === WebSocket.OPEN) ...
    Ответ написан
    1 комментарий
  • Как создать кроссдоменный запрос в nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вообще всю жизнь так работало:
    res.writeHead(200, {
      'Content-Type': 'text/event-stream; charset=UTF-8',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive',
      'Access-Control-Allow-Credentials': true,
      'Access-Control-Allow-Origin': '*'
    });

    Но если не работает, то сделайте параметр в урле SSE обработчика https://[url-server]:8081/event?domain=[uri-client] и подставляйте не *, а для каждого свой свой домен.
    Кроме того, постарайтесь вешать не на 8081, а все на 80, браузеры, фаерволы и разные шлюзы любят когда все на 80. Да и балансировку тогда будет сделать проще, хардварные балансировщики и специализированные сервисы балансировки любят 80.
    Ответ написан
    Комментировать
  • Тип данных для денег в JavaScript и nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вопрос скорее про тип переменных в JavaScript, а в ноде с типами так же. Так в js есть один тип для цифр "number". Он хранит и целые и дробные. Конечно храните целые с максимальной нужной точностью, например, вместо 7.35 храните 735, а если нужна точность выше копеек, то храните, например для тысячный от копейки: 735000 и потом делите и округляйте, например Math.round(735123/1000) = 735 или Math.round(735123/1000)/100 = 7.35 и с приведением к строке (Math.round(735123/1000)/100).toString() = "7.35"
    Ответ написан
    4 комментария
  • Как передавать xml посты запросы на node.js? И как обрабатывать ответ?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    XML это зло, имея JSON нет ни малейшего повода его использовать, если только не для совместимости со старыми и унаследованными приложениями. Для ноды есть парсер: https://github.com/fb55/htmlparser2/
    Ответ написан
  • Как защитить сайт nginx + express.js от оффлайн браузеров, зловредных ботов и прочей нечисти?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Можно ограничить интенсивность запросов с одного IP, в nginx, например при помощи такого модуля nginx.org/ru/docs/http/ngx_http_limit_req_module.html или добавить фаервол/брандмауэр хардварный или софтварный.
    2. Исходные коды сервера ни кто не заберет, если Вы не напишите очевидных дыр, через которые их можно будет взять, а клиентский код заберут, но его можно чуточку испортить при помощи обфускации habrahabr.ru/post/112530 и минификации https://www.npmjs.com/package/uglify-js
    Ответ написан
    Комментировать
  • Как скопировать часть контента с сайта с помощью nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Это тыбзинг контента называется, а культурно по-буржуйски кравлинг. Делать это можно при помощи HTTP запросов родной нодовской библиотекой http, или при помощи npm библиотеки request. Полученные страницы нужно парсисть и сохранять в нужном формате в БД. Для парсинга подойдут или регулярные выражения или библиотека типа cheerio Если это товары с четкой структурой, то логичнее использовать PostgreSQL, а если товары очень разные, то можно в документную базу их писать с произвольным набором полей, например, в MongoDB.
    Ответ написан
    Комментировать
  • Правильно ли я понимаю порядок выполнения NodeJS async?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Не правильно понимаете. Если функции loadSettings и другие асинхронные, а они конечно асинхронные по своему смыслу, ведь это внешние запросы из базы или с веника, то писать нужно примерно так:
    async.parallel([
        function (callback) {
            App.loadSettings(callback);
        },
        function (callback) {
            App.loadData(callback);
        },
        function(callback) {
            App.loadData2(callback);
        },
    ]);

    И когда они завершаются, они должны уведомлять async вызовом этого самого callback
    Ответ написан
    2 комментария
  • Как отключить защиту CORS в nodeJS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вы уже сами почти все написали, только в Access-Control-Allow-Headers не добавили origin. Нужно:
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Headers', 'origin, content-type, accept');

    Но проблема может быть еще и не в этом, если Вы пробуете делать это локально и обращаетесь к localhost, то вот оно и не будет работать, эти заголовки будут игнорироваться браузером. Используйте локальный IP вместо localhost пишите 127.0.0.1
    Ответ написан
    Комментировать
  • Как вернуть результат callback-функции select-запроса на felixge/node-mysql?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Добавьте параметр в selectDB(param1, callback) и вызывайте его вместо return results. Потом в этот самый новый параметр передавайте функцию, которая должна получать результат и она будет его получать в виде параметра. Рекомендуется делать не просто callback(results), а пробрасывать ошибку наверх, чтобы ее можно было обработать: callback(err, results). Тогда вызов будет выглядеть:
    selectDB(param1, function(err, result) { /* тут будут доступны выбранные данные в result */ });

    Кстати, может вот такая библиотека упростит Вам жизнь: https://www.npmjs.com/package/mysql-utilities
    Статья по ней: habrahabr.ru/post/198738
    Ответ написан
    6 комментариев
  • Что лучше подходит для написания игрового backend многопользовательской online-игры?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Это вообще смешная цифра, которую можно на VPS получить или на своем ноутбуке проверить даже. habrahabr.ru/post/123154 А я и более миллиона выжимал на физическом компе 40-ядерном ксеоне с 256 памяти.
    Ответ написан
    Комментировать
  • Как лучше делать GET запросы на node.js к серверу на php?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    var http = require('http');
    var req = http.request({
      host: 'hostname.com',
      path: '/path/file.php?par=1&min=1'
    }, function(res) {
      var result = '';
      res.on('data', function (chunk) { result += chunk; });
      response.on('end', function () { console.log(result); });
    });
    req.end();
    Ответ написан
    Комментировать
  • NodeJS + Socket.IO - чат, при запуске сервера возникает ошибка. Почему?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Книжки в топку, пока они выйдут все каждыц день меняется, берите примеры из онлайн документации и страницы socket.io/demos/chat
    А вообще - код в студию, там видать require нет или инициализация пропущена
    Ответ написан
    Комментировать
  • Как правильнее для node js подключать модули?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Почитайте этот вопрос и ответы на него: Как сделать возможность изменения кода приложений без перезагрузки основного приложения nodejs? Перегружать отдельные части приложения, даже если они не оформлены в модули при изменении их на винте можно при помощи fs.watch и require, предварительно удаляя их из кеша через delete require.cache[require.resolve('file-name')];
    И у Вас очень опасная мысль развивается, отождествление модуля с контроллерами и моделями. Модуль не имеет ни какого касания к MVC, какие контроллеры, какие модели? Чтобы ощутить свю абсурдность этого подумайте про встроенные модули fs, http, stream и т.д. они контроллеры или модели? А внешние модули async, colors, request они контроллеры или модели? Почитайте habrahabr.ru/post/117791 и еще habrahabr.ru/post/204958
    Ответ написан
    1 комментарий