Ответы пользователя по тегу Node.js
  • JS API и REST API - это разные понятия?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. REST не имеет ни какого отношения к CURL.
    2. Устоявшегося понятия JS API не существует, оно сложилось исключительно у Вас в голове.
    3. Противоположностью REST (и STATEless) есть STATEful, т.е. связь без состояния и с состоянием. Без состояния каждый запрос отдельный и не переводит сервер в другое состояние, не переводит само соединение (или сессию) в состояние и не переводит клиента в другое состояние. На самом деле, практически все, что называется REST им не является, см. мою статью habrahabr.ru/post/204958
    4. Скорее всего Вы хотите спросить про противопоставление HTTP API и RPC API. В отличие от HTTP API (которое обычно называют по незнанию или запудрпенности мозгов REST API) удаленный вызов процедур (RPC API) для можно делать на базе TCP, UDP, TLS или эмулировать для веба на WebSocket или HTTP+SSE или других протоколах.
    Ответ написан
    2 комментария
  • [Node.JS] [node-mysql] Как возвращать значение функции?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Не мучайтесь, а просто примите факт, что в node.js принято делать все функции, работающие с сетью, файлами и базами данных в асинхронном стиле, т.е. они возвращают значения не через return, а через callback. Перенесите свой if в callback, а лучше объявите функцию и передайте ее как callback параметр, чтобы вложенность не нарастала. Привыкнете...
    Ответ написан
    4 комментария
  • Шаблонизатор на основе node.js с хранилищем объектов в MySQL и постобработкой на webkit?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Хотите переизобрести веб?
    1. Избавьтесь от DOM, замените его компонентами, как в Delphi и в .NET. Вообще, HTML и CSS это очень плохие технологии для приложений, которые отбросили нас на два десятилетия.
    2. Избавьтесь от HTTP, перейдите к RPC, это удобно для клиент-серверных приложений с установлением соединения, где взаимодействие через: вызов удаленных процедур и трансляцию событий.
    3. Избавьтесь от реляционных СУБД и храните объекты без декомпозиции, строя вокруг них индексы, для быстрого поиска в коллекциях.

    И да поможет Вам Аллах!
    Ответ написан
    3 комментария
  • Как понять что response.write закончен?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    // после res.on('data') вставляем еще обработчик:
    res.on('end', function() {
      response.end();
    });
    Ответ написан
    1 комментарий
  • Как организовать файловое хранилище пользователей (виртуальная фс или нативная)?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    А тут все зависит от количества и размера файлов, от количества пользователей и от распределения файлов по пользователям. Поясняю, если пользовтелей много (миллионы) а файлов у них мало (десятки) то у Вас будет много папок, а в них мало файлов, это не экономный расход файловой системы, будет много уходить на оглавление, и будет папка с медленным доступом (в которой лежат папки пользователей). Если пользователей мало, а файлов много, то так же, будут папки с очень большим оглавлением. Тут можно или выбрать файловую систему, которая решает эти проблемы или самому сбалансировать дерево папок, чтобы поиск был оптимальным. Как добиться оптимального поиска, сделать сбалансированную структуру папок, чтобы в каждой было не много и не мало файлов с очень различающимися названиями. Например, можно сделать 2х или 3х уровневую систему папок, в которой лежат файл переименованные в HEX, например /EA8D253F/2145AE32/F259C201 Нам нужно генерировать случайные имена папок и файлов, а потом в базу данных писать этот путь. это будет оптимально для любой файловой системы и любого кол-ва файлов, просто увеличте длину имен, алфавит и вложенность папок (в завистмости от особенности файловой системы и своих нужд, это нужно изучать). Кроме всего, это решает кучу проблем - файлы с одинаковыми именами и файлы со странными символами в именах (в том числе арабские, китайские и прочие UTF8 имена), исполняемые файлы и вообще вопрос безопасности, относительную деперсонализацию данных, и прочее... Про FTP лучше забудьте, ни какие пользователи по FTP ходить не должны, это архаичный протокол позднего проволочного века, применяемый сейчас только мной и прочими извращенцами. А если Вы еще будете вычислять для файлов хеши, несколько разных хешей на всякий случай, и хранить их вместе с именами и всеми метаданными, в базе, то можно избавиться от дублирования на диске (есть случаи, когда у разных пользователей большой процент одинаковых файлов). Вот тут кое-какие наброски: /lib/impress.files.js#L111-L174 даже файлы на винте сжимаются двумя ZIP и GZIP в зависмсти от размера. Берите, дарю методу...
    Ответ написан
  • Какие библиотеки использовать для высоконагруженного приложения в Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Общий совет, использовать как можно меньше сторонних библиотек и писать все на нодовских родных, чтобы проект не превратился в зоопарк всего чего только можно. Особенно советую не использовать принцип middleware и все, что на нем основано. Так же важно максимально использовать оперативную память, снизить необходимость ввода/вывода (минимизировать доступ к базе и файлам). И постараться писать все аккуратно и экономно, без утечек и лишних операций. Подробнее посоветовать невозможно, ведь Вы даже не намекнули, что хотите сделать, это будет высоконагруженное API или высоконагруженный сервер вебсокетов или высоконагруженный сервис для агрегации твитов, например, да что угодно.
    Ответ написан
  • Как настроить кластер на Node.js Express4 Socket.IO?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Потоки в ноде нужно порождать при старте приложения, это можно делать при помощи require('child_process').fork а вот require('cluster').fork это просто обертка вокруг него, которая позволяет передавать сокеты из родительского процесса в дочерние, чтобы распылить нагрузку на потоки. Если Вы не хотите использовать cluster, то нужно будет самому передавать handle сокета в дочерние процессы, порожденные через require('child_process').fork, через IPC, и самостоятельно организовывать алгоритм распыления, например, простой Round Robin или взвешенный Round Robin или приклеивание по IP. Чем Вас не устраивает cluster? Еще год-два назад он работал нестабильно, согласен, сам делал к нему заплаты, но теперь то cluster работает отлично как в node.js, так и в io.js
    Ответ написан
  • Где взять хостинг для игры?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Комментировать
  • MongoDB и NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    function checkUserIdentity(lg, callback) {
      MongoClient.connect('mongodb://адрес', function (err, db) {
        if (err) throw err;
        db.collection('client').findOne({ login : lg }, function (err, docs) {
          if (docs) callback(null, docs._id);
          else callback(new Error("not exists"));
        });
      });
    }
    Ответ написан
    Комментировать
  • Как сделать привязку сервера с клиентом в случае сбоев в соединении, чтобы у клиента не оборвался процесс игры?

    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.
    Ответ написан
  • Как сменить порт прослушки с 80 на произвольный?

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

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