Задать вопрос
Ответы пользователя по тегу Node.js
  • Как подключать файл конфигурации к серверу node.js, с возможностью его модифицировать?

    impeee
    @impeee
    nodejs/erlang developer
    Либо nodemon, который все же будет перезагружать приложение, либо каждый раз подгружать файл заново, либо создать какой-то таймер, который отслеживал бы состояние файла, и в случае изменения - подгружал файл в память ноды. Есть еще извращенный способ - загружать конфиг в переменные окружения, и посредством process.env вытаскивать его )
    Ответ написан
    Комментировать
  • Как увеличить кол-во подключений к websockets?

    impeee
    @impeee
    nodejs/erlang developer
    1019 подключений на одной машине? Какова ее конфигурация? Какими образом посчитали количество соединений?
    Ответ написан
    Комментировать
  • Как изменять статус обработки REST-запроса через WebSockets?

    impeee
    @impeee
    nodejs/erlang developer
    В RESTful есть такая практика: возвращать в качестве ответа пользователю не данные, а статус 202 Accepted вместе с линком, по которому клиент уже сам отслеживает состояние процесса, т.е. те же http-запросы. Линк примерно такого плана: /resource/id, id должен быть всегда уникален, без коллизий. Создать нужно механизм очередей на серверной стороне.
    Ответ написан
    1 комментарий
  • Как правильно сформировать структуру БД?

    impeee
    @impeee
    nodejs/erlang developer
    Самый простой вариант - завести новое поле в постах, например "user_id", хранящее уникальный _id пользователя, создавшего этот пост, и например агрегацией вытаскивать данные пользователя, дополнительно поработав фильтром:

    db.posts.aggregate([
       {
          $lookup: {
              from: 'user',
              localField: 'user_id',
              foreignField: '_id',
              as: '_user'
           }
       }
    ]);


    Либо в коллекции пользователя завести поле 'posts', которое являлось бы массивом, и хранило _id постов. Однако в таком случае стоит помнить о лимите на размер коллекции.
    Ответ написан
    2 комментария
  • Socket.io авторизация со своим сгенерированным токеном, как?

    impeee
    @impeee
    nodejs/erlang developer
    Токен может хранить любую информацию в зашифрованном виде. В случае успешной авторизации поместите в токен такое уникальное значение, на основании которого в последствии вы сможете получить данные пользователя, организовав на их основании сессию. Самый простой случай - хранить в токене уникальный id пользователя. Реализовать можно при помощи плагина "jsonwebtoken".

    Создадим отдельный модуль "secure.js" для генерации/расшифровки токена:

    let Secure = function() {
      
      const SECRET_PHRASE = 'secret';
      
      let jwt = require('jsonwebtoken');
    
      let getSecretPhrase = () => {
        return SECRET_PHRASE;
      };
      
      let generateToken = (userEntityId) => {
        return jwt.sign({ 'entity_id' : userEntityId }, SECRET_PHRASE);
      };
      
      let verifyToken = (token) => {
        return jwt.verify(token, SECRET_PHRASE);
      };
      
      return {
        getSecretPhrase : getSecretPhrase,
        generateToken : generateToken,
        verifyToken : verifyToken
      }
      
    };
    
    module.exports = new Secure();


    При авторизации по логину и паролю, сгенерируем токен для клиента в случае успеха, поместив в него уникальный _id пользователя:

    /* обращаемся к базе, находим пользователя по логину и паролю (userData) */
    let secure = require('./secure.js');
    var token = { 'token' : secure.generateToken(userData._id) };


    На стороне сервер-сокета получаем объект данного токена:

    { token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbnRpdHlfaWQiOiJ0ZXN0IiwiaWF0IjoxNDcxMDA0NDc2fQ.bu0wJbbKpNfyP2uOJWwDuzR89NkfBNmRGqUKXQ03usQ' }


    Расшифруем и вытащим из него _id пользователя из авторизации:

    let secure = require('./secure.js');
    var uid;
    try {
    uid = secure.verifyToken(token).entity_id;
    } catch(e) {
    //
    }


    И по этому uid находим данные в базе.
    Ответ написан
    Комментировать