• Нормально ли отдавать статику с помощью node.js?

    @zapimir
    Лучше поставить nginx, так как он явно лучше будет, когда много не очень быстрых соединений, особенно по памяти. Еще лучше конечно статику на CDN закинуть.
    Ответ написан
    Комментировать
  • Как изменить сообщение отправленное телеграм ботом?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    bot.on('message', async (msg) => {
      const text = msg.text.toLowerCase()
      const chatId = msg.chat.id
      const message = 'TEXT'
      if (text.match('123')) {
         setTimeout(() => {
            bot.sendMessage(chatId, message)
            .then(msgData=>{
              let count = 0;
              const timerId = setInterval(() => {
                  count+=Math.floor(Math.random()*10);
                  if(count>100){
                    count=100;
                    clearInterval(timerId);
                  }
                  bot.editMessageText(`${message} (edit) ${count}%`, 
                  {
                    chat_id: msgData.chat.id,
                    message_id: msgData.message_id
                  });
              }, 500)
            })
         }, 500)
      }
    })
    Ответ написан
  • Как практиковать JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • CodeWars
    • найти на github интересный проект на JS и что-то в нём улучшить:
      1. взять актуальную проблему из Issues,
      2. разобраться,
      3. починить,
      4. отправить pull request

    Ответ написан
    Комментировать
  • Почему невозможно установить заголовки после их отправки клиенту?

    @abberati
    frontend-разработчик
    Почему нельзя дожарить картошку после того, как съел её?
    Ответ написан
    Комментировать
  • Как извлечь get параметр с url?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    const query = new URLSearchParams(location.search);
    query.get( "lpkay1" )

    https://developer.mozilla.org/ru/docs/Web/API/URLS...
    https://developer.mozilla.org/en-US/docs/Web/API/U...
    Ответ написан
    Комментировать
  • Как сбросить состояние всех компонентов одной кнопкой?

    kritskiy_a
    @kritskiy_a
    Frontend-developer
    function resetColor(params) {
        setStatus(!status)
      }
    Ответ написан
    Комментировать
  • Какая разница в работе сервера на node js с nginx и без?

    karabanov
    @karabanov
    Системный администратор
    Разница колоссальная.

    Nginx нужен, как минимум, чтобы:
    Эффективно раздавать статику (JS, CSS, картинки, шрифты и и.д.)
    Кешировать ответы
    Терминировать SSL
    Лимитировать количество запросов с целью защиты
    Выступать в роли балансировщика нагрузки между несколькими инстансами приложения
    Фильтровать HTTP заголовки / Добавлять HTTP заголовки
    Сжимать ответы
    Ответ написан
    4 комментария
  • Как заменить паровоз if?

    Robur
    @Robur
    Знаю больше чем это необходимо
    onQuestionDelete(addinId || ticketId || id, addinId || ticketId ? id : undefined)

    но я бы поменял сигнатуру onQuestionDelete чтобы было
    onQuestionDelete(id, addinId || ticketId)
    Ответ написан
    Комментировать
  • Почему не могу сохранить измененный обьект mongoose?

    hzzzzl
    @hzzzzl
    .find() вернет массив, даже если найдется всего один документ, и пустой массив, если не найдется ничего, а массив нельзя .save()

    for (const obj of parsedObjects) {
            const dbObject = dbObjects.find(elem => elem.id === obj.id)
             .....
            // а вот здесь наверно получится
            await dbObject.save()
        }
    Ответ написан
    Комментировать
  • Как организовать работу с mongodb и докером на локалке и сервере?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ни в коем случае не пушить туда-сюда.
    • В идеальном случае ваш проект должен поддерживать миграции:
    • Каждая ревизия кода, которая нарушает совместимость с БД относительно предыдущей, должна содержать скрипт миграции. В этом скрипте создаётся структура, модифицируются старые данные, переименовываются поля и т.д. Иногда такие скрипты делают двунаправленными, чтобы поддерживать обратные миграции.
    • В БД нужно хранить версию или номер ревизии, которой соответствует текущее состояние БД.
    • При запуске приложения нужно проверять версию и выполнять цепочку миграций, необходимых для приведения версии к требуемому состоянию.

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

    Монга - это schema less БД, которая толерантно относится структуре коллекций и не валится при запросе несуществущих полей. Нужно стараться писать код максимально толерантно к отсутствию наполнения БД.

    В любом случае у вас в БД есть обычно:
    1. структура (в случае монги, как я уже сказал, это не так важно)
    2. справочники
    3. пользовательские данные
    4. производные данные (кэш), которые можно безболезненно удалить, а затем они перегенерятся сами по мере запросов.

    Нужно писать код так, чтобы он всю структуру и технические справочники, отсутствующие в предоставленной БД и необходимые для работы, умел инициализировать сам. Или, на худой конец, сделайте команду или скрипт init_db.

    Если какие-то тестовые данные нужны для тестов или отладки, то можно сделать скрипт, который заполнит БД ими. Это называется фикстуры.

    Никогда не храните код в БД. Всякие хранимые процедуры и прочее в БД - это зло. Код должен быть в системе контроля версий, а БД к этому не приспособлены. Если уж нужны хранимки, то храните их в системе контроля версий и заливайте их в БД при инициализации или миграциями.
    Ответ написан
    2 комментария
  • Вложенный роутинг для интернет магазина на Angular 9 + ng-universal, как организовать?

    syamskoy
    @syamskoy
    Тоже искал ответ на этот вопрос, но так и не нашел какого-то решения из коробки. Сделал в итоге так:
    Роутинг:
    const routes: Routes = [
        {
            path: 'category', component: LayoutShopComponent, children: [
                {path: '**', component: CategoryListComponent},
            ]
        },
    ];


    В самом компоненте подписываюсь на изменение урла, и из урла уже достаю текущую категорию, что-то вроде этого:

    constructor(
            private route: ActivatedRoute
        ) {
            route.url.subscribe((data) => {
                this.child = data.map(value => value.path);
                const arraySize = data.length;
                if (arraySize > 0) {
                    this.parentSlug = data[arraySize - 1].path;
                }
            });
            this.loadData();
        }


    И в html просто ходим по категориям:
    <a routerLink="{{category.slug}}" class="text-body">{{category.name}}</a>


    Возможно, есть более удачные решения, но найти не удалось.
    Ответ написан
    3 комментария
  • Можно ли подключиться к тегу,если он создан через insertAdjacentHTML?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Сначала нужно добавить элементы в DOM, а потом уже пытаться их оттуда получить.
    Ответ написан
    Комментировать
  • Как выстраивать работу компонентов реакт для определенных роутов?

    Robur
    @Robur
    Знаю больше чем это необходимо
    возьмите react-router и не изобретайте свой велосипед.

    в header пишете свою логику для роутов (в вашем случае -<Route path="/page1"><Button /></Route> ), в content - свою.

    Форму отправляйте программно по нажатию этой кнопки, если сама форма где-то в content. Сделать можно по разному - проще всего данные в стор положить.

    Детали зависят от того что там и как у вас должно работать.
    Ответ написан
    Комментировать
  • Авторизация через node.js passport-facebook + jwtwebtoken в rest api приложении?

    @akyl-kb
    Для начала нужно удобнее организовать структуру
    Пример как у меня организовано:
    - /models/User.js
    - /passports/facebook.js
    - /passports/google.js
    - /passport.js
    - /routes.js

    Содержимое passport.js
    const User = require('./models/User')
    const facebookStrategy = require('./passports/facebook')
    const googleStrategy = require('./passports/google')
    
    module.exports = function (passport) {
      passport.serializeUser(function (user, done) {
          return done(null, user.id)
      })
    
      passport.deserializeUser(async (id, done) => {
        try {
          const user = await User.findOne({ id })
          done(null, user)
        } catch (err) {
          done(err)
        }
      })
    
      passport.use(facebookStrategy())
      passport.use(googleStrategy())
    }


    Содержимое facebookStrategy.js:
    const assert = require('assert')
    const FacebookStrategy = require('passport-facebook').Strategy
    const User = require('../models/User')
    
    assert(process.env.FACEBOOK_APP_ID)
    assert(process.env.FACEBOOK_APP_SECRET)
    assert(process.env.APP_URL)
    
    module.exports = () => {
      return new FacebookStrategy({
        clientID: process.env.FACEBOOK_APP_ID,
        clientSecret: process.env.FACEBOOK_APP_SECRET,
        callbackURL: `${process.env.APP_URL}/auth/facebook/callback`
      },
      async (accessToken, refreshToken, profile, done) => {
        try {
          const user = await User.findOrCreate({ facebook_id: profile.id }, {
            facebook_id: profile.id,
            name: profile.displayName,
            provider: 'facebook'
          })
          return done(null, user.toJSON())
        } catch (err) {
          return done(err)
        }
      })
    }


    routes.js
    app.get('/auth/facebook', passport.authenticate('facebook'))
    app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }, (req, res) => {
      const user = req.user;
      const payload = {
          id: user._id,
          email: user.email,
      };
    
      jwt.sign(payload, secret, {expiresIn: 3600}, (err, token) => {
          if (err) {
              res.status(500).send({
                  error: 'Error signing token',
                  raw: err,
              });
          }
          // Отдаем html
          res.send(`
          <script>
            localStorage.setItem('token', '${`Bearer ${token}`}');
            localtion.href = '/'
          </script>
          `);
      });
    })


    в app.js
    const passport = require('passport')
    require('./passport')(passport)
    app.use(passport.initialize())
    Ответ написан
    3 комментария