Ответы пользователя по тегу Node.js
  • Чем учить node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вообще, нужно просмотреть документацию по API, попробовать что-то написать на небольшой задаче, и слить исходники ноды, по исходникам часто можно понять то, что по докам не очевидно. Можно найти в гитхабе несколько проектов в открытом коде и посмотреть как устроен код. Проверить свои знания можно на примерах заданий в nodeschool.io очень советую. Ну а совсем для начинающих подойдут скринкасты - learn.javascript.ru/nodejs-screencast
    Ответ написан
    Комментировать
  • Какие инструменты есть для реализации модульного приложения в node.js?

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

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Считайте и на сервере и на клиенте, чтобы постоянно не гонять между ними результаты, но иногда сравнивайте. Если клиент не делает запросы на сравнение, но другие запросы делает, или его данные отличаются от серверных, то он читер - блокируйте. Нода не очень хороша в долгих расчетах, но если формула очень простая, и вам не нужно просчитывать миры с точностью до пылинки, то проблемы не будет. Для клиент-серверного взаимодействия используйте websocket (двусторонний обмен) и Server-sent Events (односторонняя трансляция серверных событий на клиента, но много проще в реализации и надежности). При обмене клиента и сервера добавьте немного криптографии, например, постоянно изменяющийся код, которым подписывается каждое сообщение при обмене между клиентом и сервером. Код может зависеть от порядкового номера сообщения (синхронные счетчики должны быть у клиента и сервера), от предыдущего сгенерированного случайного числа, присланного сервером, от шага в игре, и этот код можно примешивать к контрольной сумме сообщения, приходящего с клиента (это чтобы было сложно написать эмулятор, прикидывающийся клиентом).
    Ответ написан
    Комментировать
  • Как парсить картинки через 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 комментария
  • Как увеличить скорость mysql на node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Кроме проблем, уже разобранных выше, для ускорения пригодится посмотреть, что такое mysql.createPool, пригодится для асинхронного исполнения конкурирующих запросов, чтобы они шли не через одно соединение и не толпились. Так же гляньте на модуль cluster, для многопоточного запуска ноды, если у Вас запросы к БД происходят во время HTTP запросов, то их можно распараллелить на несколько ядер, а по умолчанию все обрабатывается на одном ядре. Будет не лишним подумать по поводу кеширования результатов запросов в оперативной памяти, или вообще перейти от исполнения запросов к БД из HTTP-запросов, к их предварительному и отложенному исполнению. То есть, при старте забирайте как можно больше данных сразу в память (сейчас памяти много и она дешевая), на HTTP запросах делайте поиск по хешу вместо запроса к БД, а при изменениях, не делайте запрос сразу, а пишите изменение в специальную очередь и сохраняйте в БД в ленивом (lazy) режиме. Так ускоритесь на несколько порядков. Если данные не помещаются в память, то не используйте предварительное чтение, а делайте только отложенную запись. И еще может пригодиться моя либа, ну это уже для удобств, а не для скорости: https://www.npmjs.org/package/mysql-utilities Вообще, советую PgSQL или MongoDb, гораздо шустрее они и удобнее, сам уже не юзаю MySQL и рад этому.
    Ответ написан
    1 комментарий
  • Как вы используете node.js в продакшене?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Использую ноду и только ноду уже 2 года для разработки реальных проектов и всю команду нашу тоже подсадил. Проблемы в ноде три: модульный плюрализм (который все хвалят, но это ад), обработка ошибок (не всегда в распечатке стека удается получить файл, строчку и сообщение), и отсутствие централизованной архитектуры приложений. Я сторонник монолитных централизованных систем и тоталитаризма вообще, поэтому мы сделали свой сервер приложений: https://www.npmjs.org/package/impress
    Ответ написан
    Комментировать
  • Как на localhost node-сервере вывести client ip?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Попробуйте кейс заголовка "X-Forwarded-For", но скорее всего прокси его просто не устанавливает, нужно отконфигурировать nginx или haproxy или что там используется.
    Ответ написан
  • Node.js не могу установить модули. Почему?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Все правильно выдает ошибку, вы пытаетесь установить cheerio как зависимость в саму себя. Не нужно сливать с git архив, просто в пустую папку ставьте через npm install cheerio. Git для этого вообще не нужен.
    Ответ написан
    Комментировать
  • Как организовать обмен сообщениями между различными физическими серверами?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    ØMQ aka ZeroMQ
    zeromq.org
    https://www.npmjs.org/package/zmq
    или другие *MQ протоколы/библиотеки, в общем, это направление имеет много альтернативных решений, но нам роднее и дороже ZMQ
    Ответ написан
    Комментировать
  • Как и где найти модули для 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 комментариев
  • Кто делал чаты или личная переписка на Node.js для проекта с высокой посещаемостью?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Делали, вопрос глюков зависит больше от того как писать, чем от языка и среды. Это все равно, что спросить, вот если написать чат-сервер на C#, то будет ли он глючить. Потенциальная возможность написать хорошо присутствует, но в той же степени, как и возможность написать плохо.
    Ответ написан
    Комментировать
  • Как выполнить 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
    Ответ написан
    Комментировать
  • Безопасность в websockets. Возможно ли отфильтровать все соединения на уровне handshake и отключить атаки злоумышленника?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    В чем проблема то?
    https://github.com/Worlize/WebSocket-Node
    ws.on('request', function(request) {
        // filter here
        if (...) request.reject();
    });
    Ответ написан
    7 комментариев
  • Как получить элемент объекта в nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Тут не важно, нода или не нода.
    Есть два варианта:
    1. Перебором.
    2. Построить обратный индекс, где ключи и значения поменять местами.
    Может быть случай, когда несколько ключей имеют одинаковые значения, поэтому нужно держать для каждого элемента индекса массив ключей.
    var data = {
    	key1: "value1",
    	key2: "value2",
    	key3: "value1",
    	key4: "value2",
    	key5: "value3"
    };
    var index = {};
    for (var key in data) {
    	var value = data[key];
    	if (index[value]) index[value].push(key);
    	else index[value] = [key];
    }
    console.dir(index);

    Вывод:
    { value1: [ 'key1', 'key3' ],
      value2: [ 'key2', 'key4' ],
      value3: [ 'key5' ] }

    Конечно, индекс нужно перестраивать при изменении исходного объекта.
    Ответ написан
  • Наиболее подходящий дизайн для серврера которому будут обращаться очень часто, много компьютеров за маленьким ответом?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Если решитесь на ноду, то вот этот сервер приложений может и статику отдавать и данные прямо из памяти и к базам обращаться и держать вебсокеты и sse и масштабироваться на несколько машин даже и работает под linux, windows, mac. На одной машине класса i7-2600 Quad-Core, 16 GB DDR3 RAM даст более 22`000 запроса в секунду с доступом в базу или более 50`000 запроса в секунду с кешем в оперативке и с ленивым чтением базы. Выдержит 500.000 - 1.000.000 сокетов в зависимости от интенсивности и конфигурации ОС, и более 1млн SSE соединений, они однонаправленные и менее прожорлевы.
    https://www.npmjs.org/package/impress
    https://github.com/tshemsedinov/impress
    youtu.be/f6McffaVq78
    youtu.be/Zr_1YrcXtkE
    www.slideshare.net/tshemsedinov/jfwdays-2014impress
    www.slideshare.net/tshemsedinov/impress-applicatio...
    habrahabr.ru/post/200208
    habrahabr.ru/post/194250
    habrahabr.ru/post/182714
    Ответ написан
    Комментировать
  • Как подменить модуль при сборке пакета JavaScript?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вам нужен петтерн "интерфейс", т.е. одинаковый внешний вид логгера и разная реализация, подгружаемая в зависимости от платформы. Посмотрите вот тут интерфейс реализовывается через примеси: habrahabr.ru/post/183188 Вот сама библиотека с примерами https://github.com/tshemsedinov/global.js А живой пример использования этого метода можно найти тут https://github.com/tshemsedinov/impress В каталоге /lib/ есть impress.security.js, а impress.security.mongodb.js - это его реализация, или db.js - это интерфейс, а его реализации это db.mysql.js, db.mongodb.js, db.memcached.js. В последнем случае (с интерфейсом db) они не только реализуют интерфейс, но и расширяют его.
    Ответ написан
    2 комментария
  • Как организовать хранение больших текстовых данных?

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

    Как раз файловая система - это лучший способ хранить файлы. Или у вас к ней предубеждение? Не достаточно круто? Возьмите ZFS. Минимум обработки, максимум эффективности, файловые системы для этого и разрабатывалась.

    Выризать аттачи из письма нельзя.

    Почему? Вы их что в MIME BASE64 храните? Как раз нужно - делайте папку для каждого письма и сохраняйте все атачи из него в папку. Конечно, нужно держать индекс файлов и писем в СУБД, с дополнительными полями, которых нет в файловой системе. Для этого лучше взять реляционку и хранить там имена файлов в UTF-8, а на диске держать файлы переименованные, например в ID записи в БД, можно в HEX.
    Ответ написан
    6 комментариев
  • Какие есть англоязычные форумы по node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Комментировать
  • Непонятное поведение module.exports в NodeJS

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Все правильно, this в вашем примере ссылается не на объект, а на module.exports. А что вы пытаетесь сделать?
    UPD:
    Не факт, что так нужно было, не понятна задача, что нужно было сделать? В зависимости от задачи можно заменить this.variable = "value" на замыкание:
    // user.js
    module.exports = function() {
    	var foo = 'bar';
    	var fn = function() {
    		// тут будет доступно значение foo = 'bar'
    		return foo;
    	}
    	return fn;
    }

    И account.js по аналогии
    Потом можно вызывать:
    var controllers = {};
    controllers.user = require('./controllers/user')(); // обратите внимание на ()
    controllers.account = require('./controllers/account')();
    console.log(controllers.user()); // bar
    console.log(controllers.account()); // baz

    Таким образом, нет порождения новых объектов, но переменные сохраняются в замыканиях и оттуда возвращаются функциями.
    Другой вариант, интереснее для вашего случая:
    // user.js
    module.exports = { foo:  'bar' };

    И account.js по аналогии
    Потом можно вызывать:
    var controllers = {};
    controllers.user = require('./controllers/user');
    controllers.account = require('./controllers/account');
    console.log(controllers.user.foo); // bar
    console.log(controllers.account.foo); // baz

    Но по вашему коду видно, что вы еще не определились что такое user и account - это функции или прототипы? Это контроллеры или модели? Советую не использовать слова контроллер и модель, пока не определитесь, что это такое.
    Ответ написан
    Комментировать