Ответы пользователя по тегу Node.js
  • Highload чат на node.js, clustering, redis. Как происходит broadcasting сообщений?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Передача хендлов сокетов в дочерние процессы тут находится во встроенной библиотеке cluster и скрыта от разработчика. Так же все процессы пишут и читают из редиса (см в коде вызовы incr/decr, zrem/zadd). Процессы подписываются на редисовские каналы (см в коде conn.on('message'...) и conn.on('subscribe'...) ). Код в этом репозитории уже три года не изменялся, масштабирование только на несколько процессов на одной машине, ничего уникального не написано, весь этот функционал сидит в редисе, будет тратиться много ресурсов, чтобы обеспечить межпроцессовое взаимодействие ноды с ним, даже не интересно смотреть эту реализацию. Это устаревший хлам, за три года нода уже изменилась, а как изменилась инфраструктура и возможности дополнительных пакетов...
    Ответ написан
    7 комментариев
  • Можно ли реализовать такой сценарий?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Ничего сложного в этом нет, вот только рекомендую переместить переменные, или скорее это константы в /init/constants.js, а то ведь на /server/requests.js они каждый раз создаются и теряются. Например так:
    application.constants = {
      'domain1.com': { field1: "value1", ... }
      'domain2.net': { field1: "value1", ... },
        ...
    };

    А в /server/requests.js их можно будет просто возвращать в зависимости от домена сайта:
    module.exports = function(client, callback) {
      client.cache('10m');  // кешируем на 10 минут
      // отдаем нужный набр переменных для сайта
      callback(application.constants[client.host]);
    };

    Ну и в /config/hosts.js настраиваем все на одно приложение:
    module.exports = [ '*' ];
    Ответ написан
    Комментировать
  • Возожно-ли сохранить объекты node.js в Redis?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Нет. Вам же нужно их обрабатывать, они же открытые TCP сокеты, в какую базу? У каждого сокета есть идентификатор и кусок памяти свой выделен на уровне операционной системы под буфер. Кроме того, из каждого сокета что-то приходит, и в него нужно что-то слать, это что тоже через базу делать? Похоже на то, что Вам нужно почитать про TCP/IP, про сокеты и про сетевое программирование хоть несколько статей, хоть бы на Хабре может. И Вам нужен cluster, чтобы распределить эти сокеты на несколько процессов, чтобы у одного действительно память не кончилась и чтобы занять другие ядра проца.

    Кроме того, обратите внимание, что TCP - это не пакетно ориентированный протокол, а потоковый, т.е. если отправить 10кб данных одним разом, то они могут прийти одним разом, а могут подробиться как угодно, прийти за 4 раза, например, 1кб+3кб+4кб+2кб. Так же и склеиваться могут, если отправить подряд 5 фрагментов, то они могут склеиться в один. Более того, от одной посылки может отклеиться небольшая часть и приклеиться к следующей. Все, что TCP гарантирует, это то, что данные придут точно и в правильной последовательности.
    Ответ написан
    Комментировать
  • Возможно ли в node.js зашифровать исходный код?

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

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вы должны терминировать SSL в своем прокси, или с клиентской стороны, или с серверной. В зависимости от задачи. Если Вы делаете реверс-прокси и у Вас есть закрытый ключ и сайты за прокси это Ваши сайты, то Вы можете терминировать его с серверной стороны, и дальше к Вашим сайтам идет не шифрованный HTTP. А если Вы хотите делать не реверсивный, а прямой прокси и, соответственно, клиенты будут через Вас ходить на защищенный ресурс, то нужно делать клиентское терминирование, т.е. Вы взаимодействуете с браузерами по HTTP не шифрованному, а с серверами по HTTPS. В этом случае, а скорее всего это Вам и нужно, Вы ведете себя как клиентский браузер, для сервера разницы нет.
    Ответ написан
    Комментировать
  • Что не так с Node.js?

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

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Автопоиск не нужен, это представьте, ему что, все папки сканировать при каждом вызове что ли? При старте процесса запоминайте __dirname или process.cwd() и потом от него считайте. А вообще, конфиг должен считываться 1 раз при старте и нет ничего плохого, если Вы его запишете в глобальную область видимости: GLOBAL.config = require('config.js');
    и из любого места программы будете обращаться как: config.debugging
    Или можно его записать вовнутрь объекта, который у Вас уже глобальный, например: application.config = require('config.js');
    И потом вообще красиво писать: application.config.debugging
    Другими словами: USE THE GLOBAL LUKE
    Ответ написан
    2 комментария
  • Где взять пример 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
    Нет
    Ответ написан
    Комментировать
  • Можно не использовать шаблонизатор для NodeJS?

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