• Как в elasticsearch связать данные?

    AlexXYZ
    @AlexXYZ
    O Keep Clear O
    Изначально сам ElasticSearch так делать не умеет и его и не планировали делать таким. Важно понимать, что elasticsearch не база данных и не имеет таких функций по выборке, как реляционные базы. Предполагается, что вы добавите все необходимые данные для возможных вариантов запросов в сам elasticsearch. Т.е. если вы предполагали, что вам потребуется извлекать данные по соответствующему id, то эти данные и следовало добавить СРАЗУ в схему! Именно поэтому elasticsearch идёт как дополнение к базе данных, а не как её заместитель, хотя иногда и может подходить для хранилища, но не для неопределенного круга задач, как реляционные базы.
    Поэтому, если вы все-таки хотите использовать связи, то только самостоятельной выборкой данных из mongo на основе id-шников, полученных из elasticsearch.
    Ответ написан
    1 комментарий
  • Авторизация по bearer токену node.js?

    @catHD
    Начните с прочтения https://jwt.io/

    Когда вы поймете что такое jwt, у вас отпаадет вопрос: это должно быть много разных токенов для 1 пользователя, или 1 но продлевать.

    По сути вы почти всё делаете правильно, но вот это:
    через _id(уникальный) пользователя записал в базу и он по сути вечный,


    Самый простой способ обратитесь к : https://github.com/auth0/node-jsonwebtoken
    Ответ написан
    Комментировать
  • Почему MongoDB работает медленно?

    @Faliah
    В тэгах вижу mongoose. Пара советов по работе с ним: попробуйте поиграться с ограничением полей через find().select(/* объект с полями */). По умолчанию mongoose возвращает коллекцию своих обёрток над JS-объектами, которые довольно тяжелые. Получить POJO можно с помощью find().lean(). Чтобы не ждать, пока вам вернётся вся коллекция из 1500 записей, можно воспользоваться курсорами со стримами и работать с данными пачками.

    Но тут действительно сложно сказать в чём проблема - железо действительно не плохое, но проблема скорее всего в IO цикле, как это обычно и бывает, в зависимости от количества узлов между клиентом, сервером и сервером БД. Может у вас прокси перед сервером стоит и не тянет под нагрузкой, может сервер перегружен запросами и вы ждёте в очереди, может к БД много коннектов и вы, опять же, ждёте.
    Ответ написан
    1 комментарий
  • Как подключить генерацию документации по API в node.js?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Ответ написан
    Комментировать
  • Как сделать шаринг в facebook, twitter?

    @yury_egorenkov
    Попробуй renderjs.io - пока бесплатный, дальше будет значительно дешевле чем пререндер.
    Ответ написан
    Комментировать
  • PHP как установить Composer?

    t-alexashka
    @t-alexashka
    Сразу пишу legacy код
    в php.ini найдите extension=php_interbase.dll и поставьте #

    #extension=php_interbase.dll
    Ответ написан
    1 комментарий
  • Как сделать шаринг в facebook, twitter?

    Базово можно использовать вот эту штуку: https://github.com/steeve/angular-seo
    А дальше уже от конкретного проекта зависит, благо код фантома под себя потюнить очень легко.
    Ответ написан
    Комментировать
  • Как сделать голосовое оповещение как в ВК или Fb в Angular?

    mnagaev
    @mnagaev
    FullStack Web Developer
    new Audio('sample.mp3').play()
    Ответ написан
    Комментировать
  • Вопрос по node.js, нужно передать данные с роута в контроллер, как?

    @Provocation
    В двух словах: не нужно пытаться передавать io в качестве параметра.
    Его можно сделать "глобальным" на уровне app следующим образом.
    К примеру, после
    var io = require('socket.io')(server);
    написать
    app.set('io', io);
    после чего можно в любом обработчике получить его через
    var io = req.app.get('io');
    Ответ написан
    Комментировать
  • Как в nginx перенаправить роуты?

    AirWorker
    @AirWorker
    Node.js full stack web dev
    > а остальные на ангуляр?

    вообще не понял, при чем тут ангуляр, но не суть...

    Вот часть реального конфига:

    server {
      listen  80;
      server_name example.com;
    
      location /all.css {
        root /srv/vek-node/static;
      }
      location /all.css.map {
        root /srv/vek-node/static;
      }
      location /img {
        root /srv/vek-node/static;
      }
      location /vendors {
        root /srv/vek-node/static;
      }
      
      location /media {
        alias /var/www/vek_staging/media;
      }
    
      location /catalog/metal {
        rewrite ^ http://metal.example.com$request_uri? permanent;
      }
    
      location /admin {
          uwsgi_read_timeout 600;
          client_max_body_size 30m;
          include /etc/nginx/uwsgi_params;
          uwsgi_pass unix:/run/uwsgi/app/vek_staging/socket;
      }
    
      location /static {
        alias /var/www/vek_staging/static;
      }
    
      location / {
        include /etc/nginx/proxy_params;
        proxy_read_timeout 120;
        proxy_pass http://127.0.0.1:3331;
      }
    }


    1) Первые четыре директивы location задают раздачу контента из папки static, при этом uri не содержит /static/. Здесь переопределяется root.
    2) Пятая директива location задают раздачу контента из папки media, при этом uri начинается с /media/. Здесь используется директива alias.
    3) Шестой location - все что начинается с /catalog/somesubpart - редиректим на поддомен, с таким же uri.
    4) location /admin - передаем запрос uwsgi-приложению (Django)
    5) location / - все остальное проксируем на 127.0.0.1:3331 (Node.js)

    Пример довольно показательный, используются почти все популярные фишки.

    UPD: первые четыре директивы location определяются довольно тупо - это плата за их распознавание без префикса. Но в реале это ничем не грозит - я генерирую этот конфиг галпом, конкретно gulp-nunjucks. Реальный конфиг примерно в 2 раза больше.
    Ответ написан
    Комментировать
  • Как бороться с DDOS атаками на node?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Примерно так:
    var http = require('http');
    var ipTables = {};
    
    var server = http.createServer((req, res) => {
        //Ваш обработчик запроса или express/connect вместо него
    });
    
    server.on('connection', socket => {
        var ip = socket.address().address;
        var time = Date.now();
        if(ip in ipTables) {
            if(time - ipTables[ip].time > 3000) {
                ipTables[ip] = {
                    count : 1,
                    time
                };
                return;
            }
            ipTables[ip].count++;
            ipTables[ip].time = time;
            if(ipTables[ip].count > 100) {
                socket.end('HTTP/1.1 429 Too Many Requests\n\n');
                socket.destroy(); //Обрываем соеденение, так как ip ломится слишком часто
            }
            return;
        }
        ipTables[ip] = {
            count : 1,
            time
        };
    });
    
    server.listen(80);
    Ответ написан
    Комментировать
  • Как бороться с DDOS атаками на node?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    BAN=5^T;
    Trigger: 5 qps (5 (queries per second) запросов в секунду с одного адреса на один и тот же URI)

    Сработал триггер 1-й раз: BAN+=5^1 (5 секунд бан к оставшемуся времени)
    Сработал триггер 2-й раз: BAN+=5^2 (25 секунд бан к оставшемуся времени)
    Сработал триггер 3-й раз: BAN+=5^3 ((~2мин) 125 секунд бан к оставшемуся времени)
    и т.д.

    Кол-во срабатываний (счётчик) триггера инкрементируется до тех пор, пока не истечёт время BAN'a. Как только время истекло - счётчик триггера сбрасывается.
    Ответ написан
    Комментировать
  • Как в real-time показывать добавлений комментарий?

    @pasutavitaliy
    :)
    Глобально в вашем случае - нет разницы между выводом комментрия к посту всем кто на странице и выводом сообщения в чате всем кто в нем сейчас состоит. Поэтому примеры с чатами вполне подойдут.
    А логика примерно следущаяя:
    1) На сервере создать сокет сервер, который будет слушать по некому урлу:порту
    var express = require('express');
    var app = express();
    var io = require('socket.io')(http);
     http = require('http').Server(app);
     http.listen(yourPort, yourUrl, function () {
            console.log('App listening at http://%s:%s', yourUrl, yourPort);
            io.on('connection', function(socket){...}

    2) На клиенте подключится к этому урлу:порту
    socket = io.connect(yourUrl:yourPort, {secure: true, forceNew: true});

    3) На клиенте слушать некое событие из сервера. Например назовем его onCommentAdd
    socket.on('onCommentAdd', function(msg) {
            yourFuncToAddCommentInHTMLDOM(msg)
     });


    Где на месте msg будет вся необходимая информация с сервера о комментарии

    4) На сервере когда вы выполнили сохранение в базу комментария вызовите emit метод екземпляра вашего io c нужными параметрами. Примерно так
    Socket.emit('onCommentAdd', {author: "Vova", date: "1454576067", "text": "Azazazaza lalka" });


    В принципе это все, если всё сделаете правильно, то на клиенте получите новый коммент.
    Надеюсь, это поможет
    Ответ написан
    1 комментарий
  • Как запретить отправку скрипта через Socket.io?

    Duha666
    @Duha666
    Экранируйте получаемые от клиента данные. Всегда и везде, где вы их выводите, не только в чате.
    Ответ написан
    2 комментария
  • Нотификация в node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    На клиенте https://learn.javascript.ru/websockets
    На сервере https://www.npmjs.com/package/websocket
    Socket.io в наши дни решительно ни для чего не нужен, вебсокеты работают везде без костылей.
    Ответ написан
    Комментировать
  • В чём преимущество асинхронных серверов перед PHP/nginx?

    AMar4enko
    @AMar4enko

    Если коротко, то ошибка закралась вот тут:
    В асинхронном сервере в единый момент времени обрабатывается столько запросов, сколько есть воркеров

    Представьте себе, что у вас на сервер приходит запрос, связанный с выборкой данных из БД.
    Он отрабатывает, предположим, за 150 мс, из которых 130 это работа с базой данных.

    В случае с PHP у вас воркер будет заблокирован эти 150 мс для обработки других запросов.
    В случае с асинхронным сервером, он, пока запрос 1 ждет данные от БД в течение 130 мс, сможет принять и начать обрабатывать другие запросы. Предположим, что у нас один PHP-воркер. В этом случае таких запросов, как из примера, он сможет обработать семь штук за секунду.

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

    Можно, конечно, увеличить пул FastCGI, но оверхед при обработке запроса каждым воркером будет несоизмеримо выше, чем при обработке асинхронным сервером.

    Ответ написан
    4 комментария