• Как сделать привязку сервера с клиентом в случае сбоев в соединении, чтобы у клиента не оборвался процесс игры?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Генерируйте свой собственный ID на сервере, например в форме GUID (тогда не нужно будет париться даже об уникальности), передавайте его на клиента и сохраняйте а cookie и в localstorage, при разрыве и восстановлении передавайте ID на сервер и восстанавливайте сессию.
    Ответ написан
    5 комментариев
  • Ошибка при создании простейшего HTTP сервера?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Порт 8080 занят, замените порт
    Ответ написан
    2 комментария
  • Как правильно написать кастомный асинхронный модуль на NodeJS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Так можно же посмотреть, как написан тот же модуль fs: https://github.com/joyent/node/blob/master/lib/fs.js
    Как писать асинхронные функции Вы нашли, код нормальный, а вот асинхронный модуль - это нонсенс, вот модуль fs синхронный или асинхронный? Ведь в нем есть fs.readFile и fs.readFileSync. Модуль может содержать и синхронный и асинхронный код, вообще в ноде асинхронно решается обычно только ввод-вывод: работа с файлами, сетью, базой данных. Весь остальной код остается синхронным. Чувствуется, что Вы еще не полностью освоили ноду, а уже хотите делать свои модули. Рекомендую Вам перед этим почитать исходники хороших модулей, например, вот этих небольших и хорошо написанных:
    https://www.npmjs.com/package/mkdirp
    https://www.npmjs.com/package/ncp
    https://www.npmjs.com/package/colors
    Советую пройти nodeschool.io/ru и потренироваться в использовании модулей, а потом уже делать свои. Еще обязательно освойте библиотеку async: https://github.com/caolan/async и посмотрите что такое EventEmitter https://nodejs.org/api/events.html Ну и конечно читайте исходники ноды и других модулей. Статей же нагуглить или на Хабре нарыть - не должно быть проблемой.
    Ответ написан
    2 комментария
  • Как вы боретесь с удалением папок node_modules в Windows?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    У Вас какая-то рекурсия, скорее всего, в нормальном состоянии node_modules не должны так уж разрастаться.
    PS: и юзайте centos, ubuntu или debian, зачем Вы так страдаете
    Ответ написан
    3 комментария
  • NodeJS websockets on android?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Проблем при разработке не возникнет, они возникнут при масштабировании за пределы одного сервера. Если очень больших нагрузок не планируете, то не парьтесь и пишите как попало. На мобильных платформах: socket.io/docs/faq Масштабирование в пределах одного вервера: socket.io/docs/using-multiple-nodes Масштабирование за пределы одного сервера: нужно связывать процессы через шину событий ZeroMQ, Redis, RabbitMQ и т.д.
    Ответ написан
    Комментировать
  • Как поменять байты местами?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    return ((crc & 0xFF) << 8) + ((crc >> 8) & 0xFF);
    Ответ написан
    Комментировать
  • С чего начать SPA?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
  • Почему странно ведет себя mysql+node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Потому, что нет функции, в которую вернется результат работы запроса, Вы скажете, какой результат у DELETE? А я Вам отвечу, что результат этот предусмотрен у connection.query и даже DELETE может вернуть ошибку, а если некуда ее вернуть, то нарушен формат вызова функции, она имеет полное право не работать. Кроме того, ради Аллаха, не клейте SQL строками.
    var sql = 'DELETE FROM test WHERE id = ?';
    connection.query(sql, [results[0]['id']], function (err) {
      if (err) console.log('Error query');
    });
    Ответ написан
  • Как отправить ответ на запрос не сразу, а после определенного количества времени?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Замените все синхронные операции типа writeFileSync на асинхронные аналоги, чтобы они не блокировали поток обработки, и отправляйте ответ через 30-40 секунд, даже через 3-5 минут нормально, это будет работать как лонг-пулинг, т.е. пока HTTP таймаут не закончится. Только нельзя блокировать поток обработки, иначе параллельные запросы не будут приниматься.
    UPD: и еще заметил, что req.rawBody это у Вас функция, которая читает и склеивает все чанки файла, так вот она без колбека, Вы ее сделали синхронной тоже, это плохо, посмотрите как я получаю серию чанков и клею их: impress.application.js#L479-L489 В общем, видно, что Вы только частично освоили асинхронный подход и смешиваете его с синхронным, что и не позволяет сделать параллельную обработку нескольких таких запросов в одном потоке ноды. Использовать файловые потоки и pipe тут не обязательно, но можно. Только тогда нужно запус питона повесить на событие req.on('end',...) или file.res.on('finish',...) того FileStream в который пайпите req.
    Ответ написан
  • Как построить приложение клиент-серверной архитекутры?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Клиент может быть как браузерное, так и оконное приложение (например на C#, Java, но это уже редко используется, разве что в тех случаях, когда клиентское приложение должно локально взаимодействовать с API операционной системы или оборудованием и должно выводить такую графику, как браузерное приложение не может, например в некоторых играх, где нужно плотно работать с видеокартой, а из браузера ее не достать), а браузерное приложение - тут уж в любом случае JavaScript. Если оконное, то хватит и IP для связи (пишем IP и порт в конфиг), а браузерное - гораздо удобнее его открывать через доменное имя будет. Между клиентом и сервером Вам нужно будет обмениваться данными, для этого нужно выбрать: протокол и формат сериализации. Независимо от того, будет ли клиент браузерный или оконный протокол лучше всего брать HTTP (его можно проксировать и масштабировать, к такому API потом проще будет обращаться из других приложений, когда понадобиться развитие системы). Но обычный HTTP это односторонний поток запросов от клиента к серверу, а может оказаться, что для задачи нужно и обратный поток, от сервера к клиенту, например, чтобы передавать события, которые происходят на сервере, если их вызвали другие пользователи или серверные задачи. Для трансляции событий нужен протокол с установлением соединения, т.е. такой, где связь поддерживается долгое время и сервер может прислать сообщение без запроса, т.е. чтобы клиенту не довелось каждые 2 секунды переспрашивать сервер, нет ли уже каких-то данных. Для этого подойдет SSE (Server-Sent Events) это расширение HTTP протокола, но он односторонний, от сервера к клиенту, а клиент все свои запросы отдельно должен присылать, делая HTTP GET/POST запросы. Можно так же использовать WebSocket, он двусторонний, и через него можно устроить обмен данными в обе стороны, но SSE гораздо проще в реализации и я советую именно его. Теперь нужно организовать API на сервере, я для этого советую Node.js, это мой выбор, а причины я поясняю тут habrahabr.ru/post/204958 Ну и выбрать СУБД, из реляционок рекомендую PostgreSQL www.postgresql.org а из объектных (документных) MongoDB https://www.mongodb.org/ Ну и если все компоненты подходят, то вот мой сервер приложений, в котором я уже все это собрал habrahabr.ru/post/247543
    Ответ написан
    Комментировать
  • Как сменить порт прослушки с 80 на произвольный?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Проверяйте, поле req.url, парсайте его, берите из него доменное имя и на одном порту можно хоть 100 сайтов делать. Или реверспрокси на несколько портов: nginx, haproxy.
    Ответ написан
    Комментировать
  • Архитектура проекта для инвестора?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Ну... в Вашем случае, главное, чтобы инвестор не читал Тостер, а архитектуру можно сделать и после завершения проекта ))) А вообще моя лекция по архитектуре для ноды (но в ней есть много общих вопросов и полезных мыслей): https://youtu.be/Try7lmWikao И на Хабре есть специальный раздел "Анализ и проектирование систем" где проскакивают статьи по архитектуре, как например: habrahabr.ru/post/204958 Нарисуйте связь компонентов системы СУБД-сервер-клиент (трехзвенка, или больше компонентов, если есть), нарисуйте уровни по ISO/OSI, слои абстракций, дайте спецификацию API. Вот тут есть я даю расширенный план проектирования, он должен помочь: Как составить план проектирования проекта?
    Ответ написан
    Комментировать
  • На чем писать Rest API?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для 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 комментария