Ответы пользователя по тегу Node.js
  • Где развернуть nodejs бэк с бд mysql?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    В деплойменте PHP очень не похож на Node.
    PHP - голый язык с интерпретатором, к которому нужно обращаться веб-серверу (nginx, например). В то время как node поставляется уже со своим сервером, который самостоятельно способен обрабатывать запросы.

    Проще всего, на самом деле, развернуть node в VPS + Nginx внутри какого-нибудь докер контейнера. Есть ещё вариант с автоматическим деплойментом в Vercel/Heroku и подобным. Ну и самый необычный - Бигет (возможно, есть ещё такие хостинги, но я не видел), на нём можно node развернуть на обычном облачном хостинге: https://beget.com/ru/kb/how-to/web-apps/node-js

    Рекомендую вам всё же Vercel/Heroku или VPS, в зависимости от потребностей и возможностей.
    Ответ написан
    1 комментарий
  • Как подключить клиенский js и css к express?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    В вопросе вы не указали, что именно не работает, но смею предположить, что указаны неправильные ссылки на статичные файлы.

    Во-первых, строкой
    app.use(express.static(__dirname + '/public/css'));

    Вы открываете доступ только к папке /public/css. Если вы хотите открыть доступ ко всей папке public нужно использовать
    app.use(express.static(__dirname + '/public'));

    Во-вторых, вы подключаете скрипты и стили без ведущего слеша. Если перейти на внутреннюю страницу сайта, например на /subpath, то браузер будет искать стили в /subpath/css/index.css. Нужно загружать стили и скрипты с ведущим слешем, чтобы они всегда брались из корня:
    <link rel="stylesheet" type="text/css" href="/css/index.css">
    Ответ написан
    Комментировать
  • Объясните структуру веб-сервера на node js и socket.io?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    1. Epxress от Nginx отличается главным образом тем, что первый - это сервер для Node.js приложений, а второй для Linux. Вы можете не использовать Express, или не использовать Nginx. По отдельности эти технологии так же будут работать. Чаще всего, ставят связку Nginx + Express для упрощения администрирования нескольких сайтов на одном VPS. Nginx отвечает за внешний роутинг при обращению к сайту, он передаёт запрос нужному Node.js приложению (и не обязательно это должен быть Node.js + Express). А дальше уже Express разбирается с запросом и выполняет бизнес-логику.

    2. По большому счёту, в такой связке проще всего воспринимать Socket.io как расширение для Express, добавляющее поддержку сокетов. Технически, Socket.io не нуждается в Express и может работать на любом другом сервере. Но так как вы задействуете Express, запрос проходит сначала в него, а дальше управление передаётся в Socket.io. Если вас интересует более глубокое погружение - то лучше всего читать документацию Socket.io и смотреть, как работает он.

    3. https://socket.io/get-started/ https://socket.io/docs/v4/server-initialization/#w... - у Socket.io прекрасная документация, которая на примерах показывает различные варианты использования.
    Ответ написан
    1 комментарий
  • Как сделать кнопку лайков NodeJs?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вы должны разделять бекенд и фронтенд. Фронт - это то, что видит пользователь (HTML, CSS, клиентский JS), бек - это то, что вы пишите на Node.
    То, что вы хотите сделать вам нужно в первую очередь сделать на фронте, а уже затем ловить на бекенде с вашим Node.js.

    Чтобы отправить запрос без перезагрузки страницы подойдёт банальный fetch. Более извращённые варианты с сокетами не предлагаю.
    Далее, вы на фронте рисуете изменения, которые хотите: загрузку или отображение того, что лайк поставлен и отправляете запрос себе в бек ноды.

    У себя на Node ловите этот запрос, в зависимости от того, какой сервер используется.

    Примеров подобного в интернете полно. Например, вот первое видео из гугла.
    Ответ написан
    Комментировать
  • Масштабирование Nodejs?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    С темой нейросетей не знаком, но полагаю, что работают все те же правила, что и в обычном вебе:
    1) Балансировщики нагрузок. Ставите свои сетки на нескольких серверах и между ними балансируете, чтобы распределять нагрузку. Возможно, имеет смысл присмотреться к Docker Serverless или Kubernetes.
    2) Очередь сообщений, чтобы удержать все запросы в уме и ничего не потерять. Стандартные или FIFO, это уже решать вам как архитектору.
    3) Используете serverless api gateway для самого бота, чтобы динамически скалировать нагрузку в зависимости от количества запросов.
    4) Результаты можете сохранять себе в S3, а можете пытаться сразу выплёвывать сразу в телеграм как-нибудь, чтобы не захламлять свой хостинг.

    Разворачивать всё это можно где хотите: Google Cloud, AWS, Яндекс Облако. Главное, чтобы присутствовали сервисы, о которых я говорю выше. Ну и цены/локацию подбирайте под себя.
    Ответ написан
    1 комментарий
  • Сколько ассинхронных задач может одновременно выполняться?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    То, что вы ищите называется Call Stack, Event Loop - информации в интернете очень много по этому поводу.
    Мне в своё время очень понравилось вот это видео (есть русские субтитры).

    Отвечая на конкретно ваши вопросы:
    Ограничений нет, вы это поймёте из информации, которую изучите. Node будет ждать освобождения стека для выполнения следующей операции.
    Ответ написан
    Комментировать
  • Почему ошибка CORS?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Полагаю, вы пытаетесь делать запрос со страницы сайта https://site.com на ваше апи по адресу https://api.site.com/v1/user/me (надеюсь, правильно нагадал)
    Сложность в том, что, скорее всего, как правильно заметил Антон при кросдоменных запросах браузер делает preflight-запрос, чтобы убедится, что заголовки CORS есть. Подробнее: https://developer.mozilla.org/en-US/docs/Glossary/...

    В вашем же случае, если сервер у вас Express (по тегам неизвестно достоверно), то установить CORS Middleware. Вручную всё это настраивать очень часто сложно и не нужно. Точно не на уровне серверного Nginx.
    Ответ написан
    3 комментария
  • Многопоточность в Nodejs?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Самый простой способ сделать приложение многопоточным - это использовать какой-нибудь диспетчер процессов, по типу pm2. О чём и говориться в статье, в целом.

    Смысл в том, что для 99% задач, node однопоточный. И в коде нет такой команды "сделать многопоточно сейчас же". Даже Promise.all запускает функции одна за одной в асинхронном стиле.

    Делайте асинхронный код, а многопоточность создавайте с помощью сторонних приложений.
    Ответ написан
    1 комментарий
  • Как сделать таймер обратного отчёта с временем из БД + Node JS?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    При нажатии на кнопку вы должны класть текущий timestamp в базу.
    Далее, с этим timestamp'ом сверяться, вычисляя, timestamp новой возможности кликнуть на кнопку.
    UPDATE `account` SET `freeCoins`= NOW()
    Но лучше, на стороне node генерировать timestamp и уже его в базу класть.
    Ответ написан
    Комментировать
  • Как написать код для Discord-бота, чтобы он при команде выдовал роль, например: !role @ник @роль. Пишу на Node.js. Поможете?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Что именно вам не понятно? Есть документация - https://discord.js.org/#/docs/main/stable/general/...

    У пользователя есть свойство `.roles`. Которое возвращает GuildMemberRoleManager. У этого объекта уже есть метод `.add()` которой добавляет роль по объекту роли.

    Объект роли и пользователя можно получить из объекта Message, который вы поймаете из чата. Свойство `.mentions` содержит MessageMentions, который уже имеет `.users` и `.roles`.

    Совместите эти два знания и вы получите то, что хотите.
    Ответ написан
  • Не работает команда mute, что делать?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Проблема в том, что объекте message.guild.roles нет никакого метода find, консоль вам не врёт.
    Вам нужно использовать метод .fetch(), а затем перебором искать нужную роль.
    Ответ написан
    Комментировать
  • Как организовать отображение данных в реальном времени?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    1) На сервере каждые N-секунд делаете запрос к удалённому API. Получаете данные, сохраняете у себе в БД.
    2) При заходе на страницу отдаёте сохранённые данные из БД, а так же подключаете клиента к WebSocket'у. Проще всего по средствам модуля socket.io.
    3) После каждого обновления из стороннего API отправляете данные по клиентам, которые подключены к сокету.
    Ответ написан
    2 комментария
  • Как перенаправить бота с ответа с линком на ответ без линка?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Вы если задаёте вопрос, вы пишите, чё вы используете. Если бы я не знал, что вы пытаетесь написать бота для Discord с использованием discord.js - в жизни бы не понял вопроса. И поверьте, ответить на ваш вопрос становится в разы труднее.

    В вашем случае:
    У объекта Message есть переменная channel, которая ровняется объекту TextChannel, в который было отправлено сообщение. У этого объекта есть метод .send() с помощью которого можно в этот текстовый канал отправить сообщение.
    Итоговый код:
    client.on("message", (message) => {
      if(message.content == "Привет всем"){
        message.channel.send("Привет! :wave:");
      }
    });


    Изучайте документацию, пожалуйста. Она очень удобная и понятная даже джун разработчику.
    Ответ написан
    1 комментарий
  • Почему бот не может кикать?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Кикать по сообщению можно только GuildMember'а: https://discord.js.org/#/docs/main/master/class/Gu...
    Просто так телепортировать его из нифига нельзя.

    Если вы хотите создать аналог команды:
    !kick @NICKNAME#1234

    Тогда вам нужно написать этот участок кода вот так:
    if (message.content.startsWith("!kick")) {
      var member= message.mentions.members.first(); //Это и будет объект GuildMember
      member.kick(); //Кик
    }
    Ответ написан
    4 комментария
  • Где ошибка в коде на JS?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    В том, что не создана переменная bot.

    Вы или делайте всё от переменной client, или замените инициализацию клиента на:
    const bot = new Discord.Client();

    Для вас же пример сделали прямо на главной, в чём проблема просто скопировать?
    Ответ написан
    Комментировать
  • Запрос к MySQL node.js?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Во-первых, вам правильно про промисы сказали.
    Во-вторых, я от всей души рекомендую никогда не использовать стандартный контроллер MySQL и сразу работать с query builder'ом любым. Я предпочитаю knex - очень прост в понимании, удобен, поддерживает async/await.

    Ваша же проблема решается вот так:
    function user(val) {
        return new Promise(function (resolve, reject) {
            var sss='';
            const connection = mysql.createConnection({
                database: 'base',
                host: "localhost",
                user: "root",
                password: ""
            });
    
            connection.query("SELECT * FROM `user` WHERE `uid`="+val+"",
                function(err, results) {
                    if (err) reject(err);
                    resolve(results);
                });
            connection.end();
        })
    }
    
    let user = user(31)
        .then(funnction(user) {
            console.log(user); //Здесь прийдёт
        })
        .catch(function(err) {
            console.log(err); //Здесь будет ошибка в случае чего
        })
    Ответ написан
    Комментировать
  • Почему подключенный файл не видит модули?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    JavaScript - это не PHP. Здесь не файл подставляются при require, а импортируется метод, функция, класс или что-то другое из подключаемого файла. При этом, вы не можете использовать функции, если они не импортированы и не экспортированы в самом файле.

    Читайте документацию по модулям: https://learn.javascript.ru/modules
    Ответ написан
    Комментировать
  • Как из массива node.js закинуть данные в массив js?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    1. Вы можете создать свой API на базе Express'а, например, который будет отдавать необходимые данные при запросе.
    2. Если данные обновляются не часто и вы знаете об этом - вы можете сохранить массив в виде JSON объекта в файл и обращаться к нему из JavaScript.

    Суть одна - вы с фронтенда должны обращаться на бекенд за этим массивом.
    Ответ написан
    Комментировать
  • Как посчитать онлайн со всех воркеров?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    Создайте отдельный микросервис, который будет опрашивать воркеры и складывать их данные в базу. Заодно и узнаете, кто упал, а кто нет.
    Ответ написан
  • Сколько можно сделать запросов одновременно в NodeJs?

    TTATPuOT
    @TTATPuOT
    https://code.patriotovsky.ru/
    От 1 до миллиона миллионов. Node js не многопоточный язык, а асинхронный. Очень хорошее видео для понимание асинхронности: https://youtu.be/8cV4ZvHXQL4

    А так - скорее всего, вы никогда не "упрётесь" в лимит запросов. Лимит определяется оптимизацией вашего кода и качеством железа, на котором запущено приложение. + всегда можно масштабировать горизонтально приложение. А так же создавать несколько параллельно работающих приложений, распределяя нагрузку между ними. PM2 это умеет, например.
    Ответ написан
    1 комментарий