Ответы пользователя по тегу Node.js
  • Где посмотреть архитектуры для сайта?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Комментировать
  • Как правильно подключать и использовать внешние модули в ImpressAS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Теперь подключение модулей несколько изменилось, для этого случая в /applications/my-app/config/sandbox.js в раздел api добавьте 'node-expat' и тереь из любого обработчика можно будет обращаться к нему как api.nodeExpat. Не забудьте обновить версию Impress до сегодняшней 0.1.372, там исправлена проблема с заменой тире в именах модулей, т.е. преобразованием spinalToCamel, например: node-expat в nodeExpat, потому, что писать api['node-expat'] как-то не красиво, лучше api.nodeExpat и я это поправил.

    Теперь о случае с аплоадом, в Вашем коде почему-то не видно где происходит аплоад файла, а сразу начинается парсинг. Если Вы хотите делать аплоад, то его нужно делать в обработчике post.js, а потом для парсинга уже и для других долгих операций ответветвлять процесс. Вообще, имеет ли смысл ответвлять процесс - это большой вопрос, потому как fork работает не быстро, а новый процесс ест память, так что, если парсинг быстрый (занимает десятки миллисекунд), то нет смысла его форкать, а если это несколько секунд блокирования процесса, то да - тут нужно форкать.
    Ответ написан
    Комментировать
  • NodeJs Как узнать включен или нет?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    http.get('http://127.0.0.1/', function() {
      console.log('started');
    }).on('error', function() {
      console.log('not started');
    });
    Ответ написан
    5 комментариев
  • Как правильно выполнять разовые операции в ImpressAS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Если операция должна быть доступна из разных мест приложения, то ее можно положить в /applications/myApp/lib, но тут, скорее всего, речь идет об операции, навешенной на обработчик HTTP, но чтобы она не мешала другим запросам. Если такая операция долгая, в этом случае, ее нужно форкнуть в отдельный процесс, как сделано в примере: /applications/example/server/examples/tools/forkWorker.json

    Файл: get.js
    module.exports = function(client, callback) {
      client.context.data = { someDataForWorker: 'parameterValue' };
      client.fork('worker');
      callback();
    };


    Файл: worker.js
    module.exports = function(client, callback) {
      console.log('Message from forked worker');
      console.dir(Object.keys(client));
      callback();
    };


    Из worker.js видны соединения с базой, все, что подгружается из /lib и /init, это полноценный процесс, только не обрабатывающий HTTP.
    Ответ написан
    Комментировать
  • Как установить nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Сделайте скрипт и запустите его или по одной команде запускайте:
    #!/bin/bash
    sudo apt-get -y install wget
    sudo apt-get -y install build-essential openssl libssl-dev pkg-config python
    cd /usr/src
    sudo wget http://nodejs.org/dist/v4.1.1/node-v4.1.1.tar.gz
    sudo tar zxf node-v4.1.1.tar.gz
    sudo rm -f ./node-v4.1.1.tar.gz
    cd node-v4.1.1
    sudo ./configure
    sudo make
    sudo make install
    cd ~
    sudo rm -rf /usr/src/node-v4.1.1
    Ответ написан
    2 комментария
  • Указать proxy в NodeJs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    3 комментария
  • Как работает модуль cluster в nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Без cluster нода работает на 1 ядре, для масштабирования создаются новые процессы через cluster.fork(); Каждый из процессов может узнать, он главный или дочерний, через cluster.isMaster и cluster.isWorker. Между процессами можно передавать сообщения (события) и сокеты (дескрипторы сокетов). Таким образом, tcp или http сокеты принимаются главным процессом, а на обработку отправляются в один из дочерних. Это в двух словах, подробнее хорошо все написано в доках https://nodejs.org/api/cluster.html
    Ответ написан
    4 комментария
  • Возможно ли в REST сервисах отправлять запрос на сервер в виде JSON документа?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    var data = { field1: 1, field2: 2, field 3: { fdgfd: 3 } };
    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/api/method', true);
    xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
    xhr.send(JSON.stringify(data));
    Ответ написан
    Комментировать
  • Как из node.js обратиться к com порту?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Ответ написан
    Комментировать
  • Как синхронизировать количество онлайна?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Пишите в базу, например в монгу через inc. Через process.send тоже не плохо синхронизировать, но между процессами лучше сделать TCP сокеты, я сравнивал, они работают быстрее. Хотя, если речь идет всего то о кол-ве подключений, то это без разницы чем синхронизировать, это не много данных и не очень интенсивный обмен.
    Ответ написан
    2 комментария
  • Можно ли так делать в socket.io node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Делать require без присвоения в переменную можно и нужно, но только не внутри события connection, потому, что require исполняется синхронно, это блокирующая операция, т.е. на каждом подключении будет выполняться код, который будет приводит к чтению файла, а при этом не отдает управления в eventloop. Лучше поместите io на старте в глобальную переменную типа
    global.api = {};
    api.io = require('socket.io')(80);
    api.events.connection = require('./lib/connection');
    api.events.login = require('./lib/login');
    ...
    api.io.on('connection', api.events.connection);

    А в файле /lib/connection.js написать:
    module.exports = function (socket) {
      socket.on('login', api.events.login);
      ...
    });
    Ответ написан
  • Веб-сервер на Node.js. Почему дублируется ответ и не отправляются данные?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    На '/data' Вы не делаете response.end(); Вообще использовать в этом случае switch это плохо, нужно делать поиск по хешу и всемто readFileSync делать readFile с колбэком. Посмотрите вот тут хороший пример: https://github.com/perfectjs/node-server/blob/mast...
    Ответ написан
    5 комментариев
  • PHPStorm, куда слезть с него? nodejs / frontend разработчики, поможете?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    3 комментария
  • Как правильно организовать роутинг на node?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Чтобы сделать хорошо, нужно сделать без express, например, аналог Вашего кода:

    var http = require('http');
    
    var me = { name: 'jura', age: 22 };
    
    var routing = {
      '/': 'welcome to homepage',
      '/user': me,
      '/user/name': function() { return me.name; },
      '/user/age': function() { return me.age; }
    };
    
    var types = {
      object: function(o) { return JSON.stringify(o); },
      string: function(s) { return s; },
      undefined: function() { return 'not found'; },
      function: function(fn, req, res) { return fn(req, res) + ''; },
    };
    
    http.createServer(function (req, res) {
      var data = routing[req.url],
          result = types[typeof(data)](data, req, res);
      res.end(result);
    }).listen(80);


    И более универсальный вариант с параметрами:

    var http = require('http');
    
    var me = { name: 'jura', age: 22 };
    
    var routing = {
      '/': 'welcome to homepage',
      '/user': me,
      '/user/name': function() { return me.name; },
      '/user/age': function() { return me.age; },
      '/user/*': function(client, par) { return 'parameter=' + par[0]; }
    };
    
    var types = {
      object: function(o) { return JSON.stringify(o); },
      string: function(s) { return s; },
      number: function(n) { return n + ''; },
      undefined: function() { return 'not found'; },
      function: function(fn, par, client) { return fn(client, par); }
    };
    
    var matching = [];
    for (key in routing) {
      if (key.indexOf('*') !== -1) {
        var rx = new RegExp(key.replace('*', '(.*)'));
        matching.push([rx, routing[key]]);
        delete routing[key];
      }
    }
    
    function router(client) {
      var rx, par, route = routing[client.req.url];
      if (route === undefined) {
        for (var i = 0, len = matching.length; i < len; i++) {
          rx = matching[i];
          par = client.req.url.match(rx[0]);
          if (par) {
            par.shift();
            route = rx[1];
            break;
          }
        }
      }
      var renderer = types[typeof(route)];
      return renderer(route, par, client);
    }
    
    http.createServer(function (req, res) {
      res.end(router({ req: req, res: res }) + '');
    }).listen(80);
    Ответ написан
    3 комментария
  • Как вы относитесь к короткоживущим процессам в NodeJS?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Расскажу, какая ситуация с этим у меня в Impress и что меня в этом устраивает и не устраивает.

    Сейчас процессы для обработки запросов порождаются при старте, и повторно порождаются при падении. Утечки памяти или падения процессов - считаю ненормальным поведением, но в реальности не все используемые библиотеки пушу я и даже не весь код приложений пишу я, поэтому нужно как-то с утечками и падениями бороться. Конечно падения минимизированны, т.к. весь прикладной код выполняется в sandbox`ах, и при утечках можно просто создать новый sandbox в том же процессе, восстановить в нем все нужные структуры данных, потом заменить ссылку со старого (утекшего или испорченного при исключении sandbox`а) на новый и убить старый. Это быстрее, чем порождать новый процесс.

    Но иногда хочется ответвить обработку одного запроса в отдельный процесс, чтобы он не мешал другим. Сейчас у меня реализовано прозрачное для приложений порождение нового процесса для этих случаев, т.е. сделано нечто подобное воркерам. Но процессы запускаются относительно медленно. Кроме того, есть еще планировщик заданий, который должен выполнять часть бизнес-логики по расписанию.

    Как я хочу сделать. Кроме процессов обработки запросов иметь еще некоторый пул подготовленных запущенных процессов, которые уже и соединение к БД установили и развернули все что нужно в памяти. С родительским процессом они связаны TCP-сокетом, через который налажен RPC (полноценный вызов удаленных процедур с поддержкой колбэков, событий, асинхронного вызова нескольких запросов и т.д.) И когда возникает необходимость ответвить обработку или выполнить задание по расписанию, то вместо порождения процесса будет браться первый свободный процесс из пула и ему по RPC приходит заказ. Когда он все выполнил, то он по RPC возвращает колбэк или событие.

    Вот все у меня уже вроде готово для этого и сам RPC написан и отлажен, скоро реализую. А дальше по тому же RPC (но с транспортом через вебсокеты) собираюсь связать и клиентские приложения, чтобы они становились единым целым с серверными процессами и воркерами.
    Ответ написан
    2 комментария
  • Как создать приложение на поддоменах meteor?

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

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    global.varName = 'value';
    Ответ написан
    Комментировать
  • Почему не все серверы пишутся на Node js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Потому, что он подходит не для всех задач Что можно написать на Node.js?
    2. Потому, что не для всех приемлем JavaScript, люди так привязаны к синтаксису
    Ответ написан
    2 комментария
  • Как сделать функцию более расширяемой в будущем?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Как это Вы так быстро распарсили req.headers, там может быть такое, например:
    Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
    Accept-Language: da, en-gb;q=0.8, en;q=0.7
    Accept-Language: cmn-Hans-CN
    Accept-Language: i-enochian
    Accept-Language: cel-gaulish
    Accept-Language: *

    или даже более сложное, см. спецификацию:
    https://tools.ietf.org/html/bcp47
    www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4

    Чтобы правильно распарсить есть библиотеки:
    https://github.com/gagle/node-bcp47
    https://github.com/tinganho/node-accept-language

    2. Делать require внутри обработчика это ужас. Это синхронная операция чтения из файла, которую нужно делать при старте сервера. Нужно положить все языки в один файл и прочитать его при старте, а потом обращаться к справочнику в памяти.

    3. Middleware detected, ну и конечно же не использовать next, если это конечно более-менее серьезный нагруженный проект в продакшене, а не прототип и не макет.
    Ответ написан
  • Как распарсить FormData запрос в nodejs?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Когда парсать MIME, а это формат не простой, то не будет в том греха, есливозьмете модуль https://www.npmjs.com/package/multiparty и будете его применять, только если content-type точно содержит MIME
    var contentType = req.headers['content-type'];
    if (contentType && contentType.indexOf('multipart') === 0) {
      var form = multiparty.Form();
      form.parse(req, function(err, fields, files) {
        if (!err) {
          // тут имеем files
        }
      });
    }

    Благословенны пишущие без Expressa
    Ответ написан
    1 комментарий