Задать вопрос
Ответы пользователя по тегу Node.js
  • Как правильно построить логику приложения?

    @rPman
    Если у загружаемых данных (объектов) нет какого то уникального идентификатора, сделай его из самих данных, взяв к примеру md5 хеш из строки, в которую сериализовал данные (только если внутри есть списки, постарайся чтобы порядок в них не гулял или отсортируй их, речь идет исключительно для получения строки, которая будет для одних и тех же данных всегда одинаковой)

    А дальше все просто, храни этот идентификатор рядом с данными в базе и в момент записи проверяй уникальность именно по нему

    p.s. осторожно, хеш не гарантирует отсутствие коллизий, т.е. что разные данные не дадут одинаковый хеш, с другой стороны вероятность этого события очень мала и пока ты не перекапываешь весь интернет, ты с этим не столкнешься, ну в крайнем случае можно подобрать функцию хеширования с большей битностью для уменьшения этой вероятности
    Ответ написан
    Комментировать
  • Как сделать так, чтобы страница держалась в открытом виде многое время?

    @rPman
    у тебя 2 пути

    простой и дорогой, нужно запустить 100 браузеров (в каждом свой профиль со своими настройками прокси)

    сложный но эффективный - нужно проанализировать исходные тексты веб сервиса, понять как работает страница и симулировать нужные тебе действия с помощью отправки запросов с помощью твоего nodejs

    p.s. скорее всего не получится где то сэкономить или упростить, эти два пути не только являются граничными но и единственно рабочими
    Ответ написан
  • Как использует ресурсы компьютера Node.js?

    @rPman
    nodejs идеологически однопоточный, то что внутри у него могут быть потоки, это для реализации асинхронного поведения заведомо синхронных вещей...

    после 10.5 версии были добавлены worker_threads гре разработчик может создавать настоящие треды, но для доступа к данным из соседних потоков нужно использовать соответствующие типы данных, например слать сообщения или создавать SharedArrayBuffer...

    p.s. так как адекватных структур данных для многопоточного доступа в nodejs не завезли, то вся работа покроется кучей лишнего кода для реализации недостающего функционала, поэтому если это так критично, лучше реализовывать важные места на более адекватных языках программирования
    Ответ написан
    5 комментариев
  • Как парсером достучаться до объекта window?

    @rPman
    а он есть? window объект окна браузера, у тебя есть браузер?
    пользователь в где? в телеге нет доступного из кода браузера
    бот-парсер запущен не на телеге а на твоем сервере, там ты запустил браузер?
    Ответ написан
    Комментировать
  • Как приложение electron положить скрипт написанный на golang?

    @rPman
    скрипт придется компилировать, либо заранее либо таскать с собой golang (гуглить: portable golang) если же нужно еще и оффлайн, то заранее подгрузи нужные зависимости
    запуск приложения из electron:
    var child = require('child_process').execFile;
    var executablePath = "myapp.exe";
    var parameters = ["--my_param"];
    
    child(executablePath, parameters, function(err, data) {
         console.log(err)
         console.log(data.toString());
    });
    Ответ написан
    Комментировать
  • Автооплата по номеру телефона на Node JS?

    @rPman
    Самый дешевый api для физиков - сбербанковский мобильный банк, за 60 кажется рублей в месяц (30 только получение SMS о движениях на счете) можно делать переводы на чужие счета (тоже физики), оплачивать свои шаблоны платежей и некоторые коммунальные платежи без шаблонов, с помощью отправки SMS на счет 900.

    Т.е. либо с помощью usb модема, либо с помощью приложения для андроид телефона (для apple это недоступно кажется), делаешь бота по отправке таких сообщений и чтения информации о движениях на счете.

    Осторожно, смски тарифицируются сотовым оператором как обычные, так что если будет много наверное озаботиться лучше соответствующим тарифом.

    Осторожно2. Активное использование счета физика для отправки денег другим физикам наказывается баном счета ибо это противозаконная деятельность, хз как это выставляется, по объемам или по количеству сделок, сам лично таким не занимался просто изучал возможность и доступный функционал.
    Ответ написан
    1 комментарий
  • Как откатить версию ноды?

    @rPman
    Запускай свои приложения, настроив минимальную версию окружения в контейнерах docker или рули сам с помощью lxc
    по уму можно запустить приложение в простейшем chroot, настроив минимальный образ системы с помощью debootstrap, немного поковырять с сетевыми настройками (точнее только dns так как сеть будет та же что и основной системы) и смонтировать с помощью bind копии /dev,/sys/,/proc
    Ответ написан
    Комментировать
  • Корректна ли будет такая организация Docker-контейнеров?

    @rPman
    Зачем ты разделяешь части приложения по доккер образам?

    докер образ это считай виртуальная машина на минималках, состояние которого можно (нужно) сбрасывать, и которое логически объединяет функционал, который будет работать как есть... чтобы тупо было удобно разворачивать и обновлять приложение

    я ее пойму базу данных отделить, хотя это отдельный философский разговор, нужно ли ее в принципе в докер образ засовывать, но вот все остальное должно быть одним целым

    так что ответ, хватит одного максимум двух образов
    Ответ написан
  • Возможно ли узнать время, за которое запрос приходит на сервер?

    @rPman
    Логирование и синхронизация точного времени на сервере и клиенте.

    Точный момент (миллисекунды), когда запрос 'пришел' на сервер зависит от точки, в которой происходит замер, например если замерять средствами nginx (запущенный на сервере) и к примеру момент, когда запустится cgi скрипт (первой строчкой которого поставить запись времени в лог) - будут отличаться на десяток миллисекунд.

    Причина в том, как именно запрос обрабатывается, асинхронно или нет (скрипт может принять его либо в тот момент как пришел первый сетевой пакет, или же с последним).
    Ответ написан
  • Каким образом можно минифицировать хеш для имени файла?

    @rPman
    Лучший способ - имя = номер версии, т.е. буквально каждое изменение файла увеличивает номер на единицу (если к имени файла не добавлять его строковое, то нумерация на весь проект будет общая), для этого на этапе сборки файлов придется хранить и подменять настоящие имена их номерами (в этом файле храни не только имя и номер но и хеш, уже длинный, по нему проверяй изменение файла и инициируй выдачу следующего номера).

    Так же номер можно паковать в другую систему счисления с основанием больше 10 (добавив большие маленькие буквы, как это делают в base64)

    В этом случае имя файла не превысит 4-5 символов плюс расширение (от него тоже можно избавиться, если сборка будет подготавливать конфиг для вебсервера, чтобы статика возвращала правильные заголовки content-type, но это кстати часто и не требуется)
    Ответ написан
    Комментировать
  • Как наиболее правильно разработать сервер чата с комнатами на WebSocket?

    @rPman
    Что значит
    Не лезть же каждый раз в БД, чтобы выдать пользователю информацию о других пользователях в его комнате
    ?

    У тебя websocket, что подразумевает что на клиент передается оперативная информация (изменения) а не полное состояние по таймеру, значит клиент самостоятельно хранит в себе необходимую информацию в коде на javascript в массивах или localstorage, если это так критично
    Ответ написан
  • Как в Java посредством GraalVM заставить работать nodejs модуль?

    @rPman
    Может есть какой то модуль, который может эмулировать браузер c его window объектом?

    Могу предложить решить твою задачу по другому, использовать javascript из стандартного JavaFX WebView и WebEngine компонент (это вебкит), код очень простой, из недостатков - нет поддержки gpu ускорения (проигрывание видео youtube нагружает процессор)... доступ к dom html страницы как прямой так и косвенный, через инжект javascript (через setTimeout будет доступ только к песочнице веб страницы), т.е. можно открыть тупо пустую страницу и добавить туда необходимых скриптов.
    Ответ написан
    Комментировать
  • Как удалять элементы из массива так, чтобы он не заменялся null?

    @rPman
    Не использовать массив а объект (конвертировать с помощью Object.assign) или Map, в этом случае последовательность может быть разорвана, да и порядок элементов по ключу может быть не упорядочным
    Ответ написан
    Комментировать
  • Как можно автоматизировать следующую систему?

    @rPman
    Код можно запускать из одного места и файлов, аргументами запуска в командной строке определять идентификатор владельца инстанса, все файлы с данными или что у вас там пусть хранятся в подкаталогах с именем равным этому идентификатору (но лучше конечно в базе данных хранить, тупо будет удобнее).

    Осторожно с обновлениями, точнее с перезапуском бота при обновлениях или обслуживании. Вам нужно либо делать бот таким чтобы можно было безопасно в любой момент его 'остановить' (нужно понимать что ни одна операция с файлами на диске не мгновенна), т.е. вводить механизмы по временной их остановке с ожиданием окончания критичных процессов на это время (и соответствующий мониторинг для вас, чтобы можно было оценить чего ждете).
    Ответ написан
    Комментировать
  • Как сохранять логи консоли в отдельный файл?

    @rPman
    Если нужно сохранить вывод приложения в файл, то запускать его можно просто указав перенаправления через системные пайпы:
    node myprog.js > myprog.log 2>myprog.err
    Ответ написан
    Комментировать
  • Почему не приходит событие disconnect от socket.io после отключения интернета?

    @rPman
    Разрыв в сети, пока открыто соединение, - штатное состояние в tcp/ip, совершенно нормально открыть ssh подключение к серверу, вытащить провод из роутера, через десяток другой минут вставить - и все будет работать даже ошибки не выскочит (пока не попробуете послать пакет во время дисконекта).

    Именно для этого придумали различные таймауты, а socket.io сам еще и пинги отправляет периодически

    https://socket.io/docs/v3/client-api/index.html
    тюньте под вашу задачу timeout, reconnectionDelay, reconnectionDelayMax
    Ответ написан
    Комментировать
  • Как правильно делпоить на AWS?

    @rPman
    Имя файла с его хешем или версией - норма! Помимо косяков браузеров, которые в различных граничных ситуациях кешируют то что нельзя, есть еще корявые провайдеры - делающие это кеширование прозрачным.

    Самый простой пример возможной работы двух версий одновременно - это возможность обеспечить непрерывную работу во время обновления.

    База данных, бакэнд и фронтэнд могут касаться в один момент времени разные версии. Притом что физически база и бакэнд могут во время обновления использовать сразу несколько разных машин, вы не можете атомарно одновременно сменить версии везде

    И не только обновление файлов может все поломать. Процесс обновления почти всегда в простом виде обрывает бизнеспроцессы, завязанные на обновляемые данные, особенно это заметно если необходимо обновлять базу, и это занимает время (десятки минут-часы), пользователи в этот момент могут получить сообщения об ошибках или даже нарушение самого бизнеспроцесса вплоть до повреждения данных, если это обновление не учло (например состояния объектов, вы вводите новое промежуточное состояние, а старая версия его не учитывает, старая версия бакэнда может пропустить новое состояние, задав неправильное с точки зрения новой версии или наоборот задать новое там где старые клиенты его не поймут и будут выдавать ошибки).

    Кстати, версия, с которой работает клиент может храниться и учитываться в сессии, чтобы случайно по середине бизнеспроцесса пользователь не перескочил, обновив страницу.

    В хардкорных случаях может оказаться что необходимо создавать промежуточную версию, учитывающую что в базе могут находиться одновременно данные из разных версий, т.е. пользователи которые начали работать сразу перед началом обновления сидят на старой версии, новые пользователи переводятся на промежуточную, которая сможет работать со всеми тремя версиям, ждем когда старые пользователи закончат работу со старой версией (на этом могут уйти часы или даже дни, все зависит от реализации и бизнеспроцессов), когда таких не останется запускается третья финишная версия, с которой корректно работают клиенты и бакэнд промежуточной версии, ждем когда исчезнут пользователи промежуточной, запускаем финишные скрипты исключения хвостов промежуточной (это могут быть временные таблицы или лишние данные/таблицы от старой).

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