• Постоянно падает сервер на node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Согласен, что таймаут нужно тоже продлевать, чтобы не приходилось часто переподключаться.
  • Постоянно падает сервер на node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Эх, а мне ее так и не довелось использовать ни в одном реальном проекте, даже поддерживать толком не успеваю, там многое нужно зарефакторить вообще, обновил малость сейчас.
  • Постоянно падает сервер на node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Нужно переподключаться, а не отсрочивать проблему.
  • Ложные сокеты при подключении к серверу на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    WebSockets используются в socket.io, но зачем оно нужно, если сами вебсокеты имеют простой интерфейс, пример кода тут habrahabr.ru/post/79038 Так что, socket.io это лишняя надстройка, не решающая ни какой задачи. Использовать AJAX вместо WebSocket невозможно, потому, что нужно дергать сервер по тамеру - это плохая идея, а long polling уже устарел и ни кому не нужен, везде давно нативные WebSocket.
  • Почему пост запрос на эту функцию отрабатывает 50 на 50?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Ну да, лучше всего перед waterfall делать валидацию переменных mail и password и если там пусто или что-то левое, то waterfall даже не пускать, сразу делать res.json({shit:"happens"});
  • Какой шаблонизатор для node js выбрать?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    И в коде EJS есть куча синхронных операций, т.е. для ноды это горе.
  • Как в nodejs принято объявлять переменные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Юрий Пузыня, счастлив встретить человека, который понимает, как работают require, global, sandboxes, а то когда начал использовать sandboxes, то было ощущение, что я единственный, кому это нужно и кто вообще открывал этот код и эти доки, кому не расскажу, все говорят - нет такого в ноде вообще, в ноде есть только app.get :)
  • Как в nodejs принято объявлять переменные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    3y3, почти так, но не совсем. require - это искуственная конструкция, накрученная над vm.createateScript. Внутри каждого скрипта, созданного через createateScript или (через его производные методы runInContext, runInNewContext...) все переменные глобальные. А модуль module.js, реализует метод require - подделывая его внутри песочницы (как и другие псевдо-нативные конструкции):
    ... 
    var sandbox = {};
    for (var k in global) {
      sandbox[k] = global[k];
    }
    sandbox.require = require;
    sandbox.exports = self.exports;
    sandbox.__filename = filename;
    sandbox.__dirname = dirname;
    sandbox.module = self;
    sandbox.global = sandbox;
    sandbox.root = root;
    ...

    Но это бы тоже не помогло, нужно же еще не дать скрипту нагадить в глобал, обернув его в функцию, это делает Module.wrap(content) который оборачивает исходник в функцию, доклеивая строки "(function(global) {" + source + "} (sandbox));" это псевдокод конечно, для пояснения того, как это работает.
    То есть, уже сейчас можно не использовать нодовский require, а сделать свой, который бедет как-то инача подделывать глобальный контекст для модулей. Я вот использую свою реализацию, потому, что мне нужно забирать из скрипта локальные переменные без прямого экспорта, т.е. тырить их из модуля и сохранять, а потом, когда этот модуль запускается опять, то восстанавливать их в его локальный контекст в том виде, как было на момент окончания его работы. Как обстоят дела в 0.11 (0.12) честно - не знаю, не смотрел еще, но все мои юниттесты и интеграционные тесты на 0.11 не падают, значит реализация во многом приемственная.
  • Как в nodejs принято объявлять переменные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Да, Сергей Протько, способ красивый, жалко, что ни как нельзя после последней скобки еще одну запятую добавить. Кстати, если уже пошел разговор про require, то иметь его в глобальном контексте - это не халяльно, я требую введения в ближайших версиях: var require = require('require'); // 100% halal
  • Как в nodejs принято объявлять переменные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Главное, НЕ используйте дибильный способ:
    var a = 0
      , b = 1
      , c = 3;

    И отступы в пробелах делайте, а не табуляцией, именно 4 пробела, даже если везде отступ в 2 используете, то для var делайте 4.
  • Как установить phonegap из npm?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Вывод npm в консоль не прикрепился, большой, но посмотрите его на том компе, на котором устанавливается, в выводе много полезного бывает.
  • Nodejs стоит ли изучать?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Использую 2 года как основной инструмент, особых проблем сырости не наблюдал, прикладные приложения делаются беззаботно, но когда лезешь вглубь, то сырость и недостаточное документирование видны, например, при работе с vm sandboxes и cluster, любое системное программирование требует читать исходники ноды самому и ориентироваться в них, потому, что доки не содержат множества скрытой функциональности и недокументированного. Все это, возможно, появится через пар месяцев в отлаженном виде в версии 0.12
  • Подсоветуйте фреймворк для node?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Примеры:
    1. В играх есть модель игрового мира, которая разделена, обычно, на общую модель, личную модель игрока, модель группы игроков (команды) и т.д. Это струкутры данных, имеющие определенные поля, хеши, массивы и хранящие состояние игры в текущий момент. Общая модель нужна для всех игроков, это состояние объектов в мире (или на карте), которое видят все, а личная модель нужна только одному игроку. С личной моделью проще, ее можно держать в оперативной памяти одного процесса и прилепить сессию пользователя к этому процессу (sticky session) по userId, sessionId или IP. А вот модели для команд, групп и с общую для всех - нужно синхронизировать между процессами, все изменения в памяти передавать инкрементно и разруливать возможные коллизии доступа.
    2. Для управления в технических системах с множеством параметров (датчики, состояния оборудования, например клапанов и насосов) тоже нужно иметь в памяти модель и хоть тут вряд ли понадобится синхронизация, но держать модель в памяти гораздо эффективнее, чем в базе.
    3. Для интернет-коммерции, финансовых, платежных и банковских систем - модель в памяти между запросами вообще незаменима, чем быстрее все работает, тем выше финансовая эффективность, клиент больше покупает или система точнее реагирует в реальном времени (или во времени приближенном к реальному) на сотни финансовых показателей и принимает решение или помогает принять решение человеку.
  • Node.js + socket.io и mysql как организовать соединение?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    К сожалению, bulk insert не реализован, не могу обещать, что он быстро появится, т.к. я не использую сейчас MySql и вношу исправления в библиотеку только если там баги или кто-то коммитает доработки.
  • Node.js + socket.io и mysql как организовать соединение?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    getConnection не приводит к созданию соединений, а release не приводит к из закрытию. Работает это так, вы сделали 10 соединений через createPool при старте программы, они сложились в массив свободных соединений. Теперь по getConnection вы берете из саммива свободных и используете, а соединение перемещается в массив занятых и другой запрос уже не возьмет это соединение. release перемещает соединение из массива занятых, обратно в массив свободных. Нужно это из-за асинхронности, параллельно может обрабатываться несколько запросов. Смело делайте пул из 100 соединений, если нагрузка не будет повышаться больше, чем на 10 соединений, то 100 соединений не будут установлены, пулы достаточно умные для этого, 100 это будет только верхний лимит, они всегда создают несколько соединений наперед, чтобы вернуть их по getConnection без ожидания, но все 100 они не сделают, если нагрузка подымется до 50 параллельных соединений, то выделится реально 53-55 соединений или около того. Потом, когда нагрузка упадет, то долго не используемые соединения будут отмирать и их кол-во устаканится в количестве на пару соединений больше, чем максимальное кол-во использованное одновременно в прошлые несколько минут.
  • Как правильно сделать Transform Stream?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Держите готовый:
    // Stream
    
    var Transform = require('_stream_transform');
    var util = require('util');
    util.inherits(NoiseStream, Transform);
    
    function NoiseStream(options) {
      if (!(this instanceof NoiseStream))
        return new NoiseStream(options);
      Transform.call(this, options);
    }
    
    NoiseStream.prototype._transform = function(chunk, encoding, cb) {
      var noise = new Buffer('"~-,._.,-~"~-,._.,-~"~-,._');
      cb(null, Buffer.concat([chunk, noise]));
    };
    
    // Usage
    
    var fs = require('fs');
    
    var readable = fs.createReadStream('src.dat');
    var noise = new NoiseStream();
    var writable = fs.createWriteStream('dst.dat');
    readable.pipe(noise).pipe(writable);
  • Как парсить картинки через GET запрос NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Ответ в коментах к моему основному ответу. Forever тут вообще ни каким боком не нужен.
  • Как парсить картинки через GET запрос NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    Чтоб это нормально работало, нельзя все запросы стартовать разом в цикле, это заберет всю память, она выделится синхронно, и не успеет отдаваться. Нужно построить очередь с определенным кол-вом слотов, т.е. одновременно отправленных запросов. Сразу занимаем все слоты, потом ждем, пока вернутся ответы, как только возвращается ответ в одном слоте, то в нем мы запускаем следующий запрос. Для этого вам нужно сделать счетчик отправленных запросов и повесить на setInterval функцию, которая будет проверять, есть ли свободные слоты. Тогда GC будет успевать освободить память, если удут проблемы с GC, то нужно будет его отключить и перейти на ручное управление сборкой мусора в памяти, это не сложно, ноду нужно будет запускать с ключами --nouse-idle-notification --expose-gc и на таймере вызывать функцию gc(). Вообще, чтобы профессионально написать такой кравлер, нужно изучить и программирование и ноду и теорию. Эта тема называется СМО (системы массового обслуживания), в книжках и в инете можно найти формулы для расчета оптимальных параметров СМО.