• Кто делал чаты или личная переписка на Node.js для проекта с высокой посещаемостью?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Делали, вопрос глюков зависит больше от того как писать, чем от языка и среды. Это все равно, что спросить, вот если написать чат-сервер на C#, то будет ли он глючить. Потенциальная возможность написать хорошо присутствует, но в той же степени, как и возможность написать плохо.
    Ответ написан
    Комментировать
  • Действительно ли back-end разработка более консервативна, чем front-end?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    Фронтэндщики влезли на сервер через окно Node.js и мостик JavaScript, и наплодили 80к пакетов, пошла жара, это можно выдержать... https://www.npmjs.org/
    Ответ написан
    Комментировать
  • Как выполнить 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 - это функции или прототипы? Это контроллеры или модели? Советую не использовать слова контроллер и модель, пока не определитесь, что это такое.
    Ответ написан
    Комментировать
  • SSE vs SOCKET.IO

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. SSE однонаправленный, только передача событий с сервера на клиент, а сокеты - двунаправленный, можно отправлять сообщения по инициативе любой из сторон и делать ответы на них. При использовании SSE, клиент еще должен связываться с сервером по обычному AJAX/JSON.
    2. SSE - это надстройка над HTTP и он прекрасно проходит через фаерволы и шлюзы, в отличие от сокетов.
    3. SSE проще реализовать, как на сервере, так и на клиенте.
    Ответ написан
  • Структура и архитектура приложения

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. SSE (Server-Sent Events)
    2. POST-запрос из PHP в ноду. Каким образом @kazmiruk удалось сделать это медленным - не ясно.
    Ответ написан
    1 комментарий
  • Как сделать автозапуск скрипта Node js после его сохранения?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Вот способ масштабировать, изменять без перезапуска, и многое другое:
    www.slideshare.net/tshemsedinov/impress-application-server-for-nodejs
    Impress: многоцелевой сервер приложений для Node.js - habrahabr.ru/post/194250/
    Ответ написан
    Комментировать
  • Стоит ли использовать Mongo и Node.js для сервиса аналога Яндекс.Метрики и Google Analytics?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Нода может помочь, если Вы реализуете предварительную консолидацию данных в оперативной памяти. Про очереди - это правильная идея. А еще, нужно оптимизировать структуру БД, если вставка записей будет медленнее, чем их поток на входе, очередь постепенно начнет захлебываться и тут уж сколько хватит оперативной памяти, очередь просто сгладит нагрузки. Но из базы же еще нужно делать выборку при генерации отчетов, а она у Вас тоже медленная, поэтому думайте над структурой базы, оптимизируйте индексы, планы исполнения.
    Ответ написан
    Комментировать
  • Копирование директории в node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    npm install ncp

    var ncp = require('ncp').ncp;
    
    ncp(source, destination, function (err) {
        if (err) { return console.error(err); }
        console.log('done!');
    });
    Ответ написан
    Комментировать
  • Как вы перезапускаете локальный сервер node.js при разработке?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    В сервере приложений Impress реализовано слежение за файлами, которые подгружены в через require. Когда они меняются, то без перезагрузки проекта старый удаляется из памяти и подгружается новый.
    Ответ написан
    Комментировать
  • [Асинхроность и nodejs] Кто что использует против callback hell и почему?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js

    Выше очень правильно заметили, что нужно разбивать методы на логические части поменьше, а не писать простыней, но еще есть проблема в том, что нужно сделать несколько запросов в БД или другим внешним источникам, к файлам, другим серверам, и потом на основе всех фрагментов данных, полученных асинхронно, исполнить бизнес-логику и сформировать ответ. Асинк прекрасно с этим справляется, как в примере ниже.

    
    var dataRequests = [];
    // массив запросов к разным данным (БД, файлы, сетевые вызовы)
    var dataResults  = {};
    // я предпочитаю не использовать массив results, который дает async
    // а вместо этого делать именованные фрагменты данных
    // и писать их в свой хеш
    
    // добавляем один запрос к данным
    dataRequests.push(function(callback) {
    	db.queryRow(
    		'SELECT * FROM TableName1 where Field1=?', [someValue1],
    		function(err, res) {
    			dataResults.firstPiceName = res;
    			callback(err, null);
    		}
    	);
    });
    
    // добавляем второй запрос к данным
    dataRequests.push(function(callback) {
    	db.queryValue(
    		'SELECT count(*) FROM TableName2 where Field2=?',
    		[someValue2],
    		function(err, res) {
    			dataResults.secondPiceName = res;
    			callback(err, null);
    		}
    	);
    });
    
    // вызываем массив запросов асинхронно
    async.series(dataRequests, function(err, results) {
    	// тут делаем бизнес-логику над dataResults в котором у нас есть
    	// все фрагменты данных .firstPiceName и .secondPiceName
    	// и формируем общий результат
    });
    

    А еще рекомендую ставить тег "node.js" на вопросы по ноде.

    Ответ написан
    1 комментарий
  • Актуальный язык программирования

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js

    Какой бы не взяли, а JavaScript все равно нужно будет осваивать, начните с него, а там, может, и Node.js приглянется.

    Ответ написан
    3 комментария
  • Агентная инфраструктура построения веб приложения

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js

    Вот Вы пока боитесь ноды, это все из-за неуверенности в новой и незнакомой технологии. Не бойтесь и смело пишите и API на ноде, и маршрутизатор на ноде, и статику нодой отдавайте, и подписку клиентов на серверные события тоже на ноде делайте. Однородность технологий стоит того, чтобы в ней разобраться. Я конечно специалист не по Java, но Абсолютно не ясно, почему вы думали использовать Java Spring MVC для бэкендов. По сути бэкенды - это API, реализованные или как RPC (stateful, взаимодействие с сохранением состояния на обоих концах) или как REST (stateless, взаимодействие без сохранения состояния). При чем тут MVC к API ? Что должен делать API, так это организовывать доступ к БД, обработку данных, выдачу ответов в нужном формате (пусть JSON), ну и в зависимости от того RPC у или REST - API может или хранить состояние в памяти или не хранить его, делая отдельные запросы независимыми, но лишая нас возможности кешировать объекты предметной области в памяти в рамках сессии. По этому поводу полезный ответ я оставил вот тут - http://toster.ru/q/49346#answer_183494

    Теперь про матрешки, чтобы от них уйти в написании API, проще всего использовать async. Основная проблема в том, что нужно сделать несколько запросов в БД и потом на основе всех фрагментов данных, полученных асинхронно, исполнить бизнес-логику и сформировать ответ.

    
    var dataRequests = [];
    // массив запросов к разным данным (БД, файлы, сетевые вызовы)
    var dataResults  = {};
    // я предпочитаю не использовать массив results, который дает async
    // а вместо этого делать именованные фрагменты данных
    // и писать их в свой хеш
    
    // добавляем один запрос к данным
    dataRequests.push(function(callback) {
    	db.queryRow(
    		'SELECT * FROM TableName1 where Field1=?', [someValue1],
    		function(err, res) {
    			dataResults.firstPiceName = res;
    			callback(err, null);
    		}
    	);
    });
    
    // добавляем второй запрос к данным
    dataRequests.push(function(callback) {
    	db.queryValue(
    		'SELECT count(*) FROM TableName2 where Field2=?',
    		[someValue2],
    		function(err, res) {
    			dataResults.secondPiceName = res;
    			callback(err, null);
    		}
    	);
    });
    
    // вызываем массив запросов асинхронно
    async.series(dataRequests, function(err, results) {
    	// тут делаем бизнес-логику над dataResults в котором у нас есть
    	// все фрагменты данных .firstPiceName и .secondPiceName
    	// и формируем общий результат
    });
    

    Ответ написан
    Комментировать