Ответы пользователя по тегу JavaScript
  • Ошибка ERR_CONNECTION_REFUSED, что не так?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ошибка "ERR_CONNECTION_REFUSED" и "TypeError: NetworkError when attempting to fetch resource" обычно указывает на то, что удаленный сервер не доступен по указанному адресу или порту.

    В вашем коде, вы указываете порт 3000 в запросе на https://example.com:3000/server/, но в коде сервера, вы слушаете порт 3000 на хосте example.com/server.
    Чтобы исправить это, вам нужно изменить значение host в коде сервера на example.com и удалить /server из пути запроса:
    const host = 'example.com';
    const port = 3000;
    
    // ...
    
    app.post('/server', (req, res) => { // изменить путь на /server
      // ...
    });


    Дополнительное, не обязательное:

    Кроме того, вы используете режим "no-cors" в запросе fetch, что означает, что запрос будет выполнен без использования CORS (Cross-Origin Resource Sharing), что может привести к блокировке запроса браузером из-за политики безопасности CORS. Если вы контролируете и настраиваете сервер, на который отправляете запрос, лучше использовать стандартный режим "cors" или "same-origin".
    const response = await fetch(
      'https://example.com/server/', // изменить путь на /server
      {
        method: 'POST',
        // mode: 'no-cors', // удалить эту строку
        headers: {
          'Content-Type': 'text/plain',
        },
        body: mail,
      }
    );

    После проверки параметров host, port и внесения изменений, ваш POST запрос должен пройти успешно.
    Ответ написан
    7 комментариев
  • Как Найти совпадения значении массива и значении объекта, и вывести ключ найденного значения объекта?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Результатом выполнения приведенной в пример функции в вопросе, будет строка 'James', так как James - единственный подозреваемый, который видел всех убитых людей в день убийства.

    В функции getKiller мы используем метод Object.entries() для перебора объекта suspectInfo и получения доступа к ключам и значениям.
    Затем мы проверяем, были ли все убитые люди видны каждому подозреваемому в день убийства с помощью метода every(). Если это так, то мы сохраняем имя этого подозреваемого в переменной killerName.
    В конце мы возвращаем killerName.

    Пример реализации функции

    function getKiller(suspectInfo, deadPeople) {
      // Создаем объект для хранения информации о том, кого видели подозреваемые
      let seenBySuspects = {};
      
      // Заполняем объект seenBySuspects информацией о том, кого видели подозреваемые
      for (let suspect in suspectInfo) {
        for (let seenPerson of suspectInfo[suspect]) {
          if (!seenBySuspects[seenPerson]) {
            seenBySuspects[seenPerson] = [];
          }
          seenBySuspects[seenPerson].push(suspect);
        }
      }
      
      // Ищем преступника
      for (let suspect in suspectInfo) {
        let allDeadPeopleSeen = true;
        for (let deadPerson of deadPeople) {
          if (!seenBySuspects[deadPerson].includes(suspect)) {
            allDeadPeopleSeen = false;
            break;
          }
        }
        if (allDeadPeopleSeen) {
          return suspect;
        }
      }
      
      // Если преступник не найден, возвращаем null
      return null;
    }

    Сначала мы создаем объект seenBySuspects, который будет хранить информацию о том, кого видели подозреваемые.
    Затем мы заполняем этот объект информацией на основе объекта suspectInfo.
    Затем мы итерируемся по всем подозреваемым и проверяем, видели ли они всех убитых людей.
    Если подозреваемый видел всех убитых людей, мы возвращаем его имя.
    Если ни один подозреваемый не видел всех убитых людей, мы возвращаем null.

    Если ответ помог, не забудьте отметить его как решение вашего вопроса.
    Ответ написан
    Комментировать
  • Как исправить ошибки в консоли при установке пакетов Vue?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Сообщение об ошибке указывает на проблему с разрешением зависимостей, вызванную конфликтом версий eslint.
    Обычно это происходит когда например одна из зависимостей вашего проекта или сам проект требует версии eslint конфликтующей с версией eslint требуемой другой зависимостью вашего проекта.

    Вам нужно устранить конфликт и повторить установку.
    Вот несколько вариантов решения проблемы:

    Сначала обновите npm: npm i -g npm
    1. Обновите версию eslint до версии, которая удовлетворяет требованиям всех зависимостей.
      Попробуйте выполнить следующую команду:
      npm install -D eslint@7.28.0
      Если это не помогает, перейдите к следующему шагу.
    2. Удалите папку node_modules и файл package-lock.json, затем переустановите зависимости с флагом --force:
      npm install --force
    3. Используйте флаг --legacy-peer-deps при установке зависимостей:
      npm install --legacy-peer-deps
      Этот флаг отключает новую систему разрешения зависимостей, введенную в NPM 7, и использует более старую версию. Он может помочь в случае проблем с разрешением зависимостей.

    Ну и настоятельно рекомендую уже не использовать vue-cli при старте новых проектов на Vue, тк это инструмент который в будущем не будет поддерживаться (уже сейчас мало поддерживается).
    Посмотрите в сторону Vite:
    npm create vue@3
    или:
    npm create vite@latest my-vue-app -- --template vue

    Гайд по миграции Vue проекта с vue-cli на vite:
    https://vueschool.io/articles/vuejs-tutorials/how-... (мог уже немного устареть)
    Ответ написан
  • Tilda zeroblock галерея-слайдер не отображает первое изображение, как исправить?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Если галерея появляется после изменения размера окна браузера или переключения на другой слайд, возможно проблема заключается в том, что галерея не имеет определенной ширины и высоты на момент загрузки страницы. Вы можете попробовать решить эту проблему, установив явно размеры для галереи-слайдера:
    window.onload = function() {
      $( document ).ready(function() {
        var Content = '#rec555753100'; //id Zero block
        var Wrapper = '#rec555985001'; //id блока popup окна BF503
        $(Wrapper + " .t-popup__container").html($(Content)).parent(".t-popup");
        $(Wrapper).addClass('ZeroInPopUp');
        $(Wrapper + " .t-slds__main").css({"width": "100%", "height": "auto"}); // Установите ширину и высоту для галереи-слайдера
      });
    };

    Также, вы можете проверить стили для изображений в галерее и убедиться, что они имеют корректные размеры и масштабирование, необходимые для отображения изображений.
    Ответ написан
    Комментировать
  • Не создаётся папка images в папке dist через gulp?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Ваш код кажется корректным.
    Чтобы папка images была скопирована в dist, вы должны убедиться, что у вас есть изображения в папке src/assets/images и что они соответствуют указанным расширениям в path.src.images.
    Ваш код ожидает, что изображения будут находиться в папке src/assets/images и будут иметь любое из этих расширений:
    jpg, png, svg, gif, ico, webp, webmanifest, json, xml

    Если у вас есть изображения в папке src/assets/images, которые не имеют ни одного из указанных расширений, или если изображения находятся в другом месте, то вам следует изменить path.src.images соответствующим образом, чтобы изображения копировались в папку dist/assets/images.
    Например, если ваши изображения находятся в папке src/images и имеют расширение .jpg, вы можете изменить path.src.images на src/images/*.jpg.

    Если ответ помог, не забудьте отметить его как решение вашего вопроса.
    Ответ написан
    Комментировать
  • Принимать созданные сделки с Битрикс24 в гугл таблицы?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Для получения значения ключа "ID" из объекта e.parameter, вы можете использовать следующий код:
    let dealId = e.parameter['data[FIELDS][ID]'];
    SpreadsheetApp.getActive().getActiveSheet().getRange(1,2).setValue(dealId);

    Обратите внимание, что ключ "ID" находится внутри объекта data[FIELDS], поэтому мы используем квадратные скобки для доступа к этому ключу. В кавычках мы указываем строку "data[FIELDS][ID]", которая соответствует ключу объекта e.parameter.

    Таким образом, вы можете получить значение ID сделки и записать его в ячейку вашей Google таблицы.
    Ответ написан
  • Как добавить функционал в код с помощью promise и async/await?

    TemaSM
    @TemaSM
    Fullstack, DevOps, InfSec
    Чтобы реализовать функционал выбора конкретного места из списка freeSeats, можно добавить аргумент функции bookTickets, который будет принимать массив выбранных мест. Затем нужно проверить, что все места из выбранного массива находятся в списке свободных мест freeSeats. Если все места доступны, то их можно забронировать.

    Чтобы реализовать выбор формата фильма и наличия еды, можно добавить соответствующие параметры в вызов функции bookTickets. Затем можно добавить проверки на соответствие параметров формата и наличия еды заданным значениям в объекте seats. Если формат фильма или наличие еды не соответствуют требованиям, можно выкинуть ошибку.

    Вот пример, как можно изменить код с учетом этих требований:
    Раскрыть код

    async function bookTickets(date, time, numTickets, selectedSeats = [], is3D = false, hasFood = false){
      try{
        const availableSeats = await checkTicketsAvailable(date, time, numTickets);
        
        // проверка наличия выбранных мест
        const unavailableSeats = selectedSeats.filter(seat => !seats[date][time].freeSeats.includes(seat));
        if (unavailableSeats.length > 0) {
          throw new Error(`Места ${unavailableSeats.join(', ')} недоступны`);
        }
    
        // проверка формата и наличия продуктов питания
        if ((is3D && !seats[date][time].format) || (hasFood && !seats[date][time].food)) {
          throw new Error(`Невозможно забронировать билеты с выбранными параметрами`);
        }
    
        console.log(`${date} вы забронировали ${numTickets} билетов на время: ${time}`);
        if (selectedSeats.length > 0) {
          console.log(`Выбранные места: ${selectedSeats.join(', ')}`);
        }
        if (is3D) {
          console.log(`Формат фильма: 3D`);
        } else {
          console.log(`Формат фильма: 2D`);
        }
        if (hasFood) {
          console.log(`С едой`);
        } else {
          console.log(`Без еды`);
        }
      } catch (error) {
        console.error(error);
      }
    }
    
    bookTickets('2023-02-17', '15:00', 2, ['11', '21'], false, true);


    В данном примере добавлены аргументы selectedSeats, is3D и hasFood для выбора мест, формата фильма и наличия еды соответственно. Затем в функции bookTickets проверяется доступность выбранных мест и соответствие параметров формата и наличия еды требованиям. Выводится сообщение о бронировании билетов и выбранных параметрах.
    Ответ написан
    Комментировать