Ответы пользователя по тегу Node.js
  • Мертвы ли шаблонизаторы?

    neuotq
    @neuotq
    Прокрастинация
    Легкое гугление вам покажет что это не так, даже из устаревшего списка много кто живой и развивается.
    Но зачастую сами шаблоны сильно зависят от архитектуры и целей приложения. В мире JS с своими SSR React/Vue и ко в купе с тем что node все ближе по похожести на браузерный js, то вопрос разных шаблонизаторов не стоит столь остро. В реакте с его JSX и прочими штуками зачем мне pug, там даже особо код и читабельнотсь не улучшится. А по функционалу тем более, ну и плюс лишняя зависимость. Ну и подобная логика в других проектах.
    Так чо шаблонизаторы живы, умирают не нужные. Много где есть свои встроенные штуки. В любом случае на чистом html) пишут редко, либо что-то мелкое.
    А во многих других фреймворках/языках с ними всё ок, развиваются активно.
    Ответ написан
    Комментировать
  • Как работать с Vite в Laravel?

    neuotq
    @neuotq
    Прокрастинация
    В исходном коде должно быть что-то вроде этого:
    @vite(['resources/css/app.css', 'resources/js/app.js'])

    А уже дальше, в зависимости от контекста окружения, запущен ли dev сервер vite и тп будет то что вы написали(в самом браузере).
    Тот код что вы прислали обычно при запущенном дев сервере(тот что npm run dev).
    Если команда npm run build выполнена успешно, и код выше(тот что с @vite) в основном layout присутствует, то вам не о чем беспокоится. Для проверки остановите дев сервер и проверьте код в браузере, он должен изменить пути в соответствии с настройками, обычно подставляя хост из .env переменной APP_URL и у вас будет нечто вроде(на локальной машине с APP_URL=http://localhost )
    <!-- Scripts -->
    <link rel="preload" as="style" href="http://localhost/build/assets/app.2c8c25ff.css" />
    <link rel="modulepreload" href="http://localhost/build/assets/app.d7d1b58b.js" />
    <link rel="stylesheet" href="http://localhost/build/assets/app.2c8c25ff.css" />
    <script type="module" src="http://localhost/build/assets/app.d7d1b58b.js"></script>
    <!-- Styles -->

    На сервере или в другом окружении с другим значением APP_URL вместо http://localhost будет иное значение.
    Ну и о дополнительной и особой настройке можно почитать в официальной документации.
    Ответ написан
    Комментировать
  • Как остановить обратный отсчет?

    neuotq
    @neuotq
    Прокрастинация
    countdown возвращает объект с разными свойствами в тч со свойством value, которое при случае когда дата "от" больше даты "до" будет отрицательным. Значит нужно добавить проверку на это значение.

    Примерно так:

    const standart = moment().tz("Europe/Moscow");  
    const nowDay = moment(standart, 'YYYY-MM-DD HH:mm');
      
    const eventDay = moment('2023-05-21 02:05', 'YYYY-MM-DD HH:mm'); 
    
    
    const countDown = () => {     
      const timers = moment(nowDay, 'YYYY-MM-DD HH:mm')
        .countdown(eventDay, "YYYY-MM-DD HH:mm");
      console.log(timers.value)
      if(interval && timers.value <= 0) {
            clearInterval(interval)
       }
          console.log(timers.toString())
       }
    
    const interval = setInterval(countDown, 1000);


    Под себя адаптируйте этот код. Ну и конечно от momentjs и компашки нужно избавиться, но это уже отдельная легаси история.
    Ответ написан
    Комментировать
  • Как при import убрать расширение .js?

    neuotq
    @neuotq
    Прокрастинация
    Через import в nodejs реализуется относительно новый принцип модулей(для nodejs) - ECMAScript. Указывать расширение файла при этом обязательно.
    Ответ написан
    Комментировать
  • Цепочка запроса с пустым значением?

    neuotq
    @neuotq
    Прокрастинация
    Понятно почему, потому в первом случае на subcat используете spread оператор, которые не сработает если объект не итерируемый.
    Во втором случае похожая проблема, у вас неопределена переменная(в данном случае свойство) и вы вызываете на ней метод сплит.
    Я бы упростил.
    // genre, search и тп как то подготовлены, в них значения верного типа либо нул
    // Например (упрощенный )
    const genre = req.query.genre ? req.query.genre.split(",") : null;
    
    const searchQuery = search ? { name: { $regex: search, $options: "i" } } : {};
    const genreQuery = genre ? { genre: { $in: genre } } : {};
    const subcategoryQuery = subCategory ? { genre: { $in: subCategory } } : {};
    const actorsQuery = actors ? { actors: { $in: actors } } : {};
    const movies = await Movie.find(
            { ...searchQuery, ...genreQuery, ...subcategoryQuery, ...actorsQuery }
        ).exec();

    Кстати, по поводу модели, может в жанрах и актерах не строку использовать? Правда останется проблема переименований, к примеру опечатка в имени актера , но это уже отдельная история, пусть будет за рамками.
    // "_id": "6420a90744a448b197042db0",
    // "name": "Stalker and Treasure",
    // genre":  [ "drama"],
    // "subcategory": "mysubcategory",
    // "actors": [ "A.Dolton", "M.Romario", "T.Milano" ],
    Ответ написан
  • Не работают inline routes react/инлайн роуты реакт, как исправить?

    neuotq
    @neuotq
    Прокрастинация
    Проверьте верно ли вы сделали настройки вашего веб сервера. Потому как в момент использование приложения, там url строка в браузере динамически подменяется и лишних запросов к вебсерверу (помимо запроса данных ) особо нет. А вот при обновлении, либо прямом заходе по url идёт прямое обращение к нему. И если у вас не верно настроен Apache или nginx (или что там у вас), то не найдя страницу/правила/логику для example.com/login (а у вас там что-то вроде index.html и дальше только папки с асетами и тп) он и вернёт соответствующий результат что ничего не наёдено.
    Ответ написан
    3 комментария
  • Как сохранить пользователя в БД, если пользователь совершил аутентификацию через ВК?

    neuotq
    @neuotq
    Прокрастинация
    0. В целом на уровне БД редко есть смысл запрещать пустой пароль.
    1. Инициируем создание объекта пользователя, заполняем поля, которые возможны (Имя, имейл если сетка отдает и тп)
    2. Сохраняем его куда-нить(ну допустим в локалсторе), создаем кукис, запоминаем что он незавершил регистрацию
    3. Пользователю показываем блокирующее любые другие штуки окошко/страницу с просьбой завершить регистрацию и ввести пароль.
    Ответ написан
    4 комментария
  • TypeError: Cannot read properties of null (reading 'role')?

    neuotq
    @neuotq
    Прокрастинация
    Оу, это печально известная ошибка на миллиард долларов, это если что не про конкретно вашу ошибку, а почему так можно делать.
    Здесь вы ищете роль
    const userRole = await Role.findOne({ role: 'user' });

    Если её нет, то соответвенно в userRole будет null, но далее вы без проверки обращаетесь userRole.role
    const user = new User({ username, hashPass, roles: [userRole.role] });

    Советую прямо сейчас начать использовать TypeScript, начните с простого пусть это будет проверка типов и отслеживание таких ситуации с возможным null.
    Это сэкономит кучу времени и кучу денег, значительно снизит непонятные ошибки на продакшене, которые сложно отловить.
    Ответ написан
  • Существует ли библиотека для трансляции php кода в node.js?

    neuotq
    @neuotq
    Прокрастинация
    Технически сам язык конечно же можно перевести в другой, я думаю даже простенькие функции будут работать.
    НО! Дальше будет куча но. Обычной трансляцией не обоёдешься, так как много подводных камней и особенностей самого API PHP, принципов работы многих встроенных библиотек, хаков, костылей и просто приёмов которые используют люди в своих проектах и тп.
    В таком огромном и сложном проекте как Wordpress этого всего просто нереальное количество.
    Вы же понимаете часто даже код больших проектов, в рамках одного языка(любого) тяжело переводить с версии на новую версию. А тут на другой язык/платформу исполнения кода.
    Это в любом случае ручной труд, а автоматический транслятор вам только будет помогать переводить конкретные конструкции, а так огромное количество ручного труда для каждого файла/класса/функций и тп.
    Технически это возможно, но займёт огромное количество человека-часов, легче с нуля написать.
    Второй вариант найти решение с условной виртуальной машиной, которая исполняет php код внутри js окружения. Были когда-то подобные пакеты, но спроса нет и всё заглохло. Это тоже трудоёмкий процесс, нужно бежать и развивать свою такую штуку.
    Поэтому сегодня есть только условные прокси на node.js, которые запускают php скрипты на php(тем или иным способом, но исполняет их именно php).
    Поэтому мы приходим к технологии WebAssembly, там есть например проект wasmer, с помощью которого можно запускать wasmer-php. Но снова таки, это не трансляция кода, а просто запуск php в среде браузера, js тут уже чисто для управления и запуска самого wasmer...
    Ответ написан
    Комментировать
  • Почему Node JS убивает процесс при запросе к MySQL?

    neuotq
    @neuotq
    Прокрастинация
    Ох.. ну вы даёте. У вас конечно же сыпется нода из-за ограничения оперативной памяти.
    Делайте запросы кусками(чанками), можно начать с 1000.
    (примерный полупсевдо код)
    const mysql = require('mysql')
    
    // создаем подключение, 
    // используем https://github.com/mysqljs/mysql#pooling-connections читать настройку!
        const pool = mysql.createPool({/*тут данные для входа*/});
    // Количество чанков
        const chunkSize = 1000;
    //Запрос на количество строк в таблице
        const poolTableSizeQuery= "SELECT count(*) as rowsCount FROM main";
    //Начинаем с определения количество строк
       pool.query(poolTableSizeQuery , function (error, results, fields) {
          if (error) throw error;    
          if (result && result[0]) {
        //Количество строк
          const rowsCount = result[0]['rowsCount']; 
       // Количество чанков размером в chunkSize (округляем значение)
          const chunksCount = Math.ceil(totalRows/chunkSize);
      // Наш запрос тепреь с ЛИМИТОМ
          const myQuery = "SELECT partname FROM `main` LIMIT";
          for(var i = 0; i < chunksCount; i++) {                 
                   //Сдвиг для текущего чанка 
                   let chunkOffset = i*chunkSize;
                   //Сдвиг для текущего чанка
                    let chunkQuery = myQuery + offset + "," + chunkSize;
                   //Выполнение твоего запроса, уже с лимитом и сдвигом
                    pool.query(chunkQuery , function (error, results, fields) {
                         if (error) throw error; 
                        //Тут выводим куда-то или ещё что.
    
                    });
                }
         }
      });

    С размером чанков можно играться.
    Алгоритм вышел такой:
    1. Создаем пул для кеширвоания подключения к БД
    2. Определяем размер чанка(на основе ограничений ОЗУ)
    3. Узнаем размер таблицы и вычисляем количество шагов
    4. Делаем запрос чанка со сдвигом
    5. Выводим пользователю результат
    6. Если чанки не кончились идем в п 4
    Из минусов, не лочится таблица, а значит не гарантии целостного результата, если данные были измененны между запросами. Если это не важно, то не парься. Если важно. то нужно придумать как лочить таблицу на запись на время выполнения скрипта,
    Ответ написан
    Комментировать
  • Как правильно настроить локальную среду разработки virtualbox + nodejs?

    neuotq
    @neuotq
    Прокрастинация
    Для локальной разработки подойдет Vagrant, после установки подбираешь подходящий box и вперед. Он значительно упрощает работу с виртуалкой и оптимизирован именно для создания и управления локальным окружением инфраструктуры для разработчика.
    Как вариант можно использовать Docker, там подход совершенно иной, но манипуляций чуть больше во время разработки. Зато для установки на сервере как раз таки Docker с его концепцией(один процесс на один сервис/сервер, безболезненный апгрейд ПО и тп) гораздо лучше подходит.
    Ответ написан
    Комментировать
  • Стоит ли учить сейчас Node.js?

    neuotq
    @neuotq
    Прокрастинация
    В данный момент разница не столь велика, груьо говоря выучив node,js можно легко перейти на io.js, но наоборот чуточку сложнее, так как io.js уже имеет некоторые фишки.
    Причина банальная, node.js управляется коммерческой компанией, политика разработки которой в последнее время до форка стала не устраивать достаточно крупную часть сообщества node,js, а так же многих основных разработчиков. вот и появился форк, который стал сразу же делать все последний можные фишки, у программеров уже давно руки сильно чесались.
    Насчет смерти node.js, пока сложно сказать, в продашене в данный момент больще node, более того многие любят что это под эгидой коммерческой организации, но io.js очень стремительно развивается, и многие технари выбирают его для своих проектов.
    Лично я бы выбрал io.js, я люблю все на острие ножа технологического стека. Кстати ведутся дискуссии вокруг слияния node.js и io.js https://github.com/iojs/io.js/issues/978
    Ответ написан
    Комментировать