• React, nodejs, jwt - как сделать аутентификацию и авторизацию с refresh token?

    @yaroslav1996
    Не знаю если вам поможет, примерно вот так можете попробывать. И это работает, проверять можете через middlewares или сделать, endpoint. По которому вы можете стучаться, по истечению времени. Пример базовый!

    const jwt = require('jsonwebtoken');
    
    const secret = process.env.TOKEN_SECRET || 'some other secret as default';
    const tokenLife = +process.env.TOKEN_LIFE || 3600;
    
    module.exports = (req, res) => {
      const { refreshToken } = req.body;
    
      jwt.verify(refreshToken, secret, (err, decoded) => {
        if (err) {
          return res.status(401).send('Unauthorised');
        }
        if (decoded) {
          const payload = {
            id: decoded.id,
            email: decoded.email,
          };
          jwt.sign(payload, secret, { expiresIn: tokenLife }, (Error, token) => {
            if (Error) {
              return res.status(401).send('Unauthorised');
            }
            res.send({
              success: true,
              accessToken: `Bearer ${token}`,
            });
          });
        }
      });
    };
    Ответ написан
    1 комментарий
  • Как передать файл на сервер через Vue?

    @ReDev1L
    А потом "front-end developer, 150k rub"
    Ответ написан
    Комментировать
  • Как остановить таймер, когда он дойдет до 00:00:00 и начать считать 'наверх'?

    xa3apg
    @xa3apg
    Unity / Back-end / Front-end Developer
    Проще адаптировать готовый вариант fareez.info/blog/countdown-timer-using-vuejs .
    Для определения, плюсовой или минусовой таймер просто считать
    computed: {
      isNegative() {
        return ((this.now - this.date) / 60000) < 0;
      }
    }

    И для более точного округления с учетом минусового и плюсового таймера при минусе дополнительно приводить в минутах часах и секундах к math.ceil а при положительном к math.floor , иначе будет на 1 цифру разниться ( вместо -30 минут показывать -31 и на оборот )
    Ответ написан
    Комментировать
  • Как отсортировать массив по алфавиту VUE?

    ['foo', 'bar', 'anything'].sort((a, b) => (a > b ? 1 : -1));
    Ответ написан
    Комментировать
  • Нормально ли на стороне клиента сортировать большие массивы?

    @rPman
    Все зависит от того, какие операции происходят при сравнении элементов.

    Если элементы - обычные объекты javascript в оперативной памяти - это быстро, и десятые доли секунды клиент может и не заметить, но если вы умудряетесь на каждый запрос сравнения лезть в DOM то это будет катастрофа.
    Ответ написан
    Комментировать
  • Нормально ли на стороне клиента сортировать большие массивы?

    kshshe
    @kshshe
    Frontend developer
    Если это не блокирует интерфейс – нормально. Если блокирует хотя бы на немного заметный промежуток времени, стоит подумать о том, чтобы сортировать на стороне сервера или в отдельном потоке (воркере).
    Ответ написан
    Комментировать
  • Синхронный и асинхронный код, почему так называется?

    MarcusAurelius
    @MarcusAurelius
    автор Impress Application Server для Node.js
    А сам код синхронным не называется, это его по ошибке или для упрощения так называют. Синхронным и асинхронным называется только API ввода-вывода, т.е. операции, прерывающие исполнение кода и требующие от системы обратиться к внешнему устройству, работающему не синхронно с центральным процессором. Операции ввода-выдвода, каковые есть: работа с дисками, портами, контроллерами, периферийными устройствами, как клава, мыша, тачскрин, разные датчики, вебкамера, сетевые карты, блютузы и другие радиомодули, принтеры, видеокарты и прочее. Все они получают задание от программы, и исполняют его отдельно, своими мощностями. Потом внешние устройства присылают программе сигнал о статусе исполнения и, возможно, полученные данные. Программа все это время может ждать (если у нее синхронное API, т.е. блокирующее) или что-то делать (если асинхронное, т.е. не блокирующее). Если программа ждет, не переходит к выполнению следующего действия, то это синхронный ввод-вывод, потому, что осуществляется процесс синхронизации программы с внешним устройством. Внешне устройство посылает прерывание, которое обрабатывает операционная система и через несколько слоев драйверов оно попадает в программу, обычно в виде колбека или события. Если программа ждала, то вызов API не завершался, она все время слушала, когда придет событие о завершении операции ввода вывода, а получив его API отдает ответ и управление переходит к следующей команде, что и называется, синхронизацией с периферийным устройством. Если программа не ждала, то вызов API сразу завершается и не блокирует поток выполнения программ, это называется асинхронным API, потому, что процесс синхронизации не происходит явно, а ответы возвращаются через события.
    Ответ написан
    3 комментария
  • Организация компонентов vue js?

    0xD34F
    @0xD34F Куратор тега Vue.js
    То, что вы показали, выглядит довольно уродливо. Можно упростить, сложив имена компонентов в массив и добавив вычисляемое свойство:

    data: () => ({
      componentNames: [ 'comp1', 'comp2', 'comp3', 'comp4' ],
      ...
    }),
    computed: {
      componentName() {
        return [ 1, 2 ].includes(this.Q) && this.componentNames[this.B - 1];
      },
    },

    <component :is="componentName"></component>

    UPD. Если дополнительно нужно передавать параметры, то в массиве можно хранить вместо имён компонентов объекты, которые будут содержать имя и набор параметров:

    data: () => ({
      components: [
        { name: '...', props: { ... } },
        { name: '...', props: { ... } },
        ...
      ],
      ...
    }),

    Вычисляемое свойство не изменится (за исключением имени, конечно), а шаблон станет выглядеть так:

    <component
      v-if="component"
      :is="component.name"
      v-bind="component.props"
    ></component>

    https://jsfiddle.net/69xv0b47/
    Ответ написан
    Комментировать
  • Как адаптивно и кросбраузерно прижать футер к низу экрана?

    AndrewHaze
    @AndrewHaze
    Умею гуглить яндексом
    <div class="wrapper">
      <div class="content">
      </div>
      <div class="footer">
      </div>
    </div>


    * {
      margin: 0;
      padding: 0;
    }
    html,
    body {
      height: 100%;
    }
    .wrapper {
      display: table;
      height: 100%;
    }
    .content {
      display: table-row;
      height: 100%;
    }
    Ответ написан
    2 комментария