Ответы пользователя по тегу JavaScript
  • Какой алгоритм работы модуля по логированию изменений файла?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    А стрим тут и не нужен, делайте fs.readFile, потом ставьте fs.watch и при изменении fs.readFile в другую переменную и сравнивайте, только нужно создать еще очередь сравниваний, потому, что файл может меняться чаще, чем закончится предыдущее сравнивание (но это чисто теоретически, если по специфике задачи известно, что он меняется с малой периодичностью, то это можно и опустить). Результат fs.readFile это объект Buffer, для сравнения двух буферов, скорее всего, если они содержат текст их можно перегнать в строки .toString() и парсить. А вот понять, идентичны ли буферы, можно при помощи Buffer.compare(buf1, buf2).
    Ответ написан
    3 комментария
  • Есть какие-нибудь ресурсы по построению правильной серверной архитектуры на node.js/io.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Архитектурные принципы не очень связаны именно с нодой, они будут примерно одинаковыми, на каком бы языке вы не писали. Первое, что я могу посоветовать, когда Вы переходите от технологий программирования к архитектуре систем, это как переход от кладки кирпича к архитектуре зданий - нужно отложить все шаблоны, которые Вы знали до того и подняться на другой уровень абстракции. А именно, нужно перестать мыслить такими понятиями, как DI (dependency injection), REST, MVC, ORM, RPC, шаблонизаторы, компоненты, сокеты, промисы и прочее - это все технологии. Что же нужно понять это: слои (layers), модули, контракты, адаптеры, клиент-сервер, 3-звенная архитектура, микросервисы, СМО (системы массового обслуживания), и т.д. Где так все собрано в одном месте - не могу сказать, я лично по крупицам все осваивал, на что положил 20 лет профессиональной деятельности. Почитайте про ISO/OSI, загляните в три мои статьи habrahabr.ru/post/227753 и habrahabr.ru/post/204958 и habrahabr.ru/post/117791 Раньше хорошие статьи по архитектуре были на www.osp.ru но, к сожалению, давно не читал его. Можно начать с книг Гради Буча и освоения UML, этот дядька сформировал достаточно полный подход и методологию проектирования программных систем, которая ведет правильным путем, но на практике, в каждом отдельном случае может быть заменена интуицией архитектора и существенно упрощена. Удачи!
    Ответ написан
    6 комментариев
  • Сервер на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    С node.js все наоборот, у него веб-сервер "внутри" приложений, а не приложения "внутри" веб-сервера. Каждое приложение само и является веб-сервером. Чтобы сделать виртуалхосты, хостить много сайтов, обрабатывать много доменов, нужно запустить много экземпляров ноды и связать весь этот зоопарк в один пучок через nginx. Если каждое приложение предполагает приличную нагрузку, то нужно каждое распараллеливать при помощи cluster и потом эти кластеры уже объединять через nginx. В результате, если у Вас будет 20 сайтов на машине, то это минимум 20 процессов ноды, а то и все 100. Есть альтернативное решение - сервер приложений, который перевлрачивает мир обратно с головы на ноги, т.е. на модель "внутри" сервера приложений много приложений: habrahabr.ru/post/247543
    Ответ написан
    Комментировать
  • Может ли callback возвращать несколько параметров?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    В callback можно передавать сколько угодно любых параметров, но принято первый параметр делать error. Ошибка находится в том коде из которого Вы вызываете этот модуль. Можно только догадываться, но скорее всего, код верхнего уровня как-то проверяет первый параметр callback, попробуйте передавать первым параметром null или давайте код в студию.
    Ответ написан
    2 комментария
  • Как в node.js запускать скрипт каждые 5 минут?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Crontab: */5 * * * * /script.sh а в скрипте запускаете node script.js
    2. Делаете require('child_process').fork('script.js'); и уже в script.js делаете setTimeout
    3. Применяете готовые решения из npm, например node-schedule, node-crontab
    Ответ написан
    2 комментария
  • Почему не работает мой способ вывода картинки в браузер на nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Все работает, положите картинку в эту же папку, запустите, откройте 127.0.0.1:8080 Тут конечно HTTP заголовки не формируются, но работает. Скорее всего у Вас процесс ноды не имеет доступ к файлу, проверьте права, если не поможет, то имя файла напишите так './logo.gif'.
    Ответ написан
    Комментировать
  • Какой язык(фреймворк) лучше выбрать языка для изучения?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Правильный вопрос, это не какой язык выбрать, а какой стек технологий выбрать, какой фреймворк для сервера и для клиента и какая СУБД. Для простых задач я не рекомендую node.js, он только кажется простым, на самом деле, писать на нем достаточно сложно, с другой стороны, что бы Вы ни выбрали, но все равно придется изучать JavaScript, от него Вы ни куда не денетесь, поэтому начинайте уже сейчас: learn.javascript.ru А node.js понадобится Вам, скорее всего, как инструмент для сборки клиентских приложений (фронтенда), т.к. на нем работают популярные сборщики.
    Ответ написан
  • Где найти работающий вариант upload file для nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вообще, в таких вопросах нужно указывать фреймворк, или говорить, что на чистом Node.js. Потому, как в каждом фреймворке есть конечно готовый рабочий вариант, выглядящий в одну строку, например вот так: https://github.com/tshemsedinov/impress/blob/maste... и форма, которая в него постает: https://github.com/tshemsedinov/impress/blob/maste... Но на каждом же код будет разный, а реализацию на чистой Node.js можно всегда найти в недрах фреймворка, например:
    https://github.com/tshemsedinov/impress/blob/maste...
    Ответ написан
    Комментировать
  • Что ждет в будущем node.js: рост или спад?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Смело берите JavaScript и Node.js как главный инструмент. Раскол команды может только взбодрить разработчиков, проект то в открытом коде. Для начала:
    learn.javascript.ru/nodejs-screencast
    learn.javascript.ru
    nodeschool.io
    Ответ написан
    7 комментариев
  • Вы работаете с Node.JS и WebSockets?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Все живо, используйте смело, и уже нативно поддерживается повсеместно, есть конечно особенности, ну и основная проблема в ноде при работе с WebSockets, что их не заморачиваясь вешают на отдельный порт, на 81, 8080 и т.д. вместо того, чтобы сделать маршруты внутри 80 потра и по URL разруливать, типа / - страница, /api/method - это API, а /ws - соединение с сокетами. В результате потом где-то порт закрыт, а при масштабировании лишняя настройка, ну и сделать много разных подключений (комнаты, шины сообщений, каналы уведомлений) при таком подходе плодить порты открытые - не выход, лучше раз заморочиться и разобраться с маршрутизацией и интеграцией вего на 80 порт. Я для себя все решил давно и комплексно, реализовав поддержку WebSockets в сервере приложений - habrahabr.ru/post/247543
    Ответ написан
    Комментировать
  • Как наиболее удобным способом получить настоящее имя файла?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    console.dir(process.argv);
    console.log(process.argv[1]);
    console.log(__filename);
    Ответ написан
  • Как написать обработчик в NodeJS, отправляющий запрос перед завершением процесса?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Смотря как завершается процесс, если по сигналам, то опробуйте:
    //do something when app is closing
    process.on('SIGINT', drainArray); // выход по Ctrl-C из консоли
    process.on('SIGTERM', drainArray); // завершение через kill
    process.on('exit', drainArray); // выход по собственному желанию
    process.on('uncaughtException', drainArray); // если свалился

    Но сделайте глобальный флаг и проверяйте его в drainArray, чтобы не запустить 2 раза:
    var drainArray = function() {
      if (!process.flagExit) {
        process.flagExit = true;
        // отправка данных
      }
    };
    Ответ написан
  • Javascript: библиотека отлова событий объектов ?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    А чем не подходит EventEmitter?

    var events = require('events');
    var test = new events.EventEmitter(); 
    test.on('событие', function() {});
    test.emit('событие');
    Ответ написан
  • Универсальная обработка запросов в NodeJS. Какие варианты?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Универсального способа быть не может, потому, что все фреймворки имеют свою архитектуру и свою философию.
    Ответ написан
    Комментировать
  • Как правильно сделать Transform Stream?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Не оттуда наследуете, смотрите пример в исходниках ноды в /lib/crypto.js
    Например класс Hash так написан, он наследует LazyTransform, вот так: util.inherits(Hash, LazyTransform); потом LazyTransform наследует от stream.Transform вот так: util.inherits(LazyTransform, stream.Transform); и потом определен метод _transform
    Hash.prototype._transform = function(chunk, encoding, callback) {
      this._binding.update(chunk, encoding);
      callback();
    };
    Ответ написан
  • Какие инструменты есть для реализации модульного приложения в node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Сервер приложений https://www.npmjs.org/package/impress
    Можно подключить несколько приложений, открыть все на одном или нескольких портах, маршрутизирует между приложениями по доменному имени в урле запросов, и внутри каждого приложения вся логика разбита на отдельные обработчики, посмотри примеры. Но это не express совместимая штука.
    Ответ написан
    Комментировать
  • Как парсить картинки через GET запрос NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Или почитайте что такое замыкание или этот код не будет работать. Или нельзя объявлять функции внутри цикла или нельзя писать var внутри цикла. Или вы учите JavaScript тут: learn.javascript.ru или ноду тут: learn.javascript.ru/nodejs-screencast а потом лабораторки тут: nodeschool.io

    var request = require('request'),
        crypto = require('crypto');
    
    var token, url;
    for (var i = 0; i < 5; i++) {
    	token = crypto.randomBytes(16).toString('hex');
    	url = 'https://wu.wsiz.rzeszow.pl/wunet/photos/s' + token + '.jpg';
    	doRequest(url);
    }
    
    function doRequest(url) {
        request.get(
        	{ uri:url, method:'GET', encoding:'binary' },
        	function (err, res, body) {
                console.time(url);
                body = new Buffer(body, 'binary');
                console.timeEnd(url);
            }
        );
    }
    Ответ написан
    3 комментария
  • Как и где найти модули для Node.js для организации кошерного REST API?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    REST есть величайшее мракобесие и маразм всех времен и народов. Берите RPC, как советуют. На голом примитивном механизме HTTP с его недоразвитым набором глаголов POST, GET, PUT, DELETE, которые невозможно расширить и кастомизировать, сложно разработать что-то более сложное, чем работа с файлами или с записями базы данных по принципу CRUD (CREATE, READ, UPDATE, DELETE). Когда же нужно сделать хоть что-то большее, над ресурсом, ввести свой глагол, то вся идеология рушится. Например, у меня есть нефтепровод с магистральными насосными агрегатами, и нужно управлять закрытием и открытием задвижек, параметрами регуляторов давления, мониторингом катодной защиты, другими подсистемами. Эти команды через POST или PUT посылать? Смешно, да? Тут нужно 5000 глаголов/методов ввести над 20ю ресурсами, а не 4 несчастных глагола над несчетным кол-вом ресурсов. Или даже над данными в БД мне нужно новые глаголы, например, хочу создать связь между двумя объектами или дать права пользователю на изменение параметра объекта или запустить отложенную задачу генерации отчетов на сервере, просто запустить и получить в ответ прогнозируемое время завершения, как это сделать на REST? Я уже не говорю о том, что операции могут быть вообще не над ресурсами. Операции могут быть над множествами, запросами (фильтрами, выборками, курсорами), над машиной состояний, над связями между несколькими ресурсами, над системой в целом или вообще над потоками данных, событий или технологическим оборудованием.
    Ответ написан
    5 комментариев
  • Как выполнить javascript-код в песочнице на сервере?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Есть такой неймспейс "vm", см. nodejs.org/api/vm.html В нем методы: vm.createContext(sandbox), vm.createScript(code, scriptName). Так же в нем класс Script и у него методы: script.runInThisContext(), script.runInNewContext(sandbox). В общем, можно создать песочницу, у которой даже не будет доступа к require, и пробросить в нее только те функции, что нужны для безопасного выполнения скрипта. Потом обернуть выполнение скрипта в Domain, см. nodejs.org/api/domain.html И тогда уж все будет точно безопасно, и доступ ко внешнему миру будет у скрипта закрыт и если он свалится, то через domain можно поймать, и global он своими данными не засрет, т.е. песочницу можно убить и создать новую, даже не перезапуская процесс ноды. Пример использования можно подсмотреть тут: https://github.com/tshemsedinov/impress/blob/maste... Там есть некоторые хитрости, например, как сделать примесь своих функций к базовым классам в песочнице и подобное.
    Ответ написан
    Комментировать
  • Возможно ли заменить Java на Node.js в больших проектах

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