Ответы пользователя по тегу Node.js
  • Как проверить наличие слова в файле txt (fs)?

    @rPman
    Что значит сверять, давать ответ есть/нет? слово это строка с любыми символами (пробелы, знаки препинания) или набор букв на каком то языке с игнорированием регистра и вспомогательных символов (встречаются в других языках), а кодировка у файла?

    Если просто строка без учета всего иного, то читаешь файл в память fs.readFileSync(filePath, 'utf8'); где utf8 - ожидаемая кодировка файла. Наличие слова в этой строке можно простым регулярным выражением new RegExp(`\\b${targetWord}\\b`, 'gi') и методом regexp.test(строка_с_содержимым_файла). Соответственно fs подключить require('fs').

    Если пользователь будет вводить что угодно (а не слово, например символы \ которые часть регулярного выражения), то можно ограничить его ввод дополнительным регулярным выражением, проверяя и ругаясь соответственно.
    Ответ написан
    Комментировать
  • Парсинг по расписанию и аплоад в БД?

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

    Если удобного идентификатора нет, то обычно самое простое, - формировать из сравниваемых данных строку одинаковым способом, и получать из нее хеш сумму (md5 более чем подходит, если данных не 16-значное количество, т.е. не нужно заботиться о коллизиях), его и используй как идентификатор и храни где-то списком как предыдущие значения и сравнивай с ново загруженной, прямо во время анализа. Записи, хеш сумма которых, не была найдена в записях, помещай в базу данных (ну или обновляй значения, если речь идет о модификации а не добавлении новых).
    Ответ написан
    Комментировать
  • Насколько целесообразно использовать массивы для хранения пользователей?

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

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

    Скорость чтения максимально просто сериализованного массива (например строка с разделителем) из десятков и сотен значений значительно превышает запрос на поиск таковых в базе данных.

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

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

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

    @rPman
    Зачем ты 7 раз запускаешь бота с одним и тем же портом?, слушать он сможет только один (точнее один на каждый локальный ip адрес).

    Чтобы ничего не выводилось пиши .on('error',()=>{}) но толку то от этого, оно в любом случае не сработает, это просто уберет вывод сообщения об ошибке
    Ответ написан
  • Как ограничить количество запросов на отправку письма активации не записывая нечего в базу данные?

    @rPman
    Добавь в ссылку время создания кода активации и огранич ее время жизни, т.е. лимит не на количество.

    Так же добавить к ссылке хеш 'от нее плюс секретную соль', или используй ассиметричное ее шифрование, чтобы не дать ее взломать
    Ответ написан
  • Как синхронизировать два запроса cron?

    @rPman
    Очевидно, что cron-стайл не решит твою задачу, что самое грустное, задача на столько простая, что решать ее сторонними инструментами и библиотеками - странно.

    Мне кажется мочь запилить свой time-task-execute сервис должен каждый программист, начинающий карьеру.

    99% работы по созданию своего сервиса - это управление временными интервалами, т.е. способ, с которым пользователь управляет своими задачами и задает время. Т.е. нет никаких проблем, чтобы сделать приложение, читающее конфиг (текстовые файлы или база данных, не важно) и организующее набор слипов (кода строк 5-10 где то - ищем ближайшую задачу, которая должна быть выполнена, делаем sleep на этот интервал, исполняем задачу, повторить).

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

    @rPman
    nodejs полностью асинхронный, когда ты вызываешь метод, помеченный async (при вызове не надо писать await) то в любой момент когда в этом методе вызывается асинхронный метод или стоит await, node будет вываливаться в свой главный event loop и обрабатывать другие запросы

    ты спокойно пиши свой setTimer, внутри вызывай свой метод без await (он должен быть помечен как async) и все должно красиво работать, везде где это возможно либо заворачивай в async метод, либо работай с promise либо пользуйся готовыми асинхронными методами
    Ответ написан
  • Как лучше синхронизовать данные между клиентом и сервером?

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

    Иногда, чтобы убрать визуальные лаги, параллельно серверу состояние игрового мира (или его часть) удерживается на клиенте и обрабатывается одновременно, по возможности синхронно (только нужно помнить что реальное состояние на сервере и на клиенте отстают по времени).

    Поэтому ответ:
    - по первой схеме сервер отправляет клиентам с периодичностью информацию об итоговом изменении уровня жизней.
    - по второй схеме сервер отправляет клиентам команду "начинайте увеличивать жизнь со скоростью X до уровня Y" и клиенты это выполняют, запустив свой таймер.
    Для контроля состояний сервер может периодически высылать хеш своего состояния чтобы клиенты могли его сравнить со своим, если они различаются значит в коде баг (например неверно обрабатывается лаги) и как минимум нужна повторная загрузка состояния с сервера
    Ответ написан
    Комментировать
  • Пропадают данные при записи в JSON файл?

    @rPman
    В необходимость правильного использования базы данных тебя уже "ткнули носом", повторять не буду.

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

    такая key-value база данных простая, удобная, быстрая, подходит там где sql это излишне. Иногда поверх этого делают индексы (файл в котором фильтруемым данным сопоставляется список id) но если возникает такая необходимость лучше все же задуматься о нормальной базе данных
    -------------------

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

    Многие нормальные IDE позволяют вести отладку с брекпоинтами по условию, в этом случае все эти логи не нужны и все можно решить парой прогонов, расставив в нужных местах брекпоинты
    Ответ написан
    Комментировать
  • Есть инсталлятор Electron-приложения для Windows?

    @rPman
    никак

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

    гугли electron obfuscation, может что то тебе подойдет, для сокрытия и запутывания исходников
    Ответ написан
  • Как хранить большие видео на сервере?

    @rPman
    Файлы! С доступом как статика на веб сервере, при необходимости права разруливать через basic auth (само собой https обязателен), добавляя пароли в url. При БОЛЬШОМ количестве файлов и сложной структуры по их управлению, заводи в базе данных прослойку а имена файлов пусть будут завязаны на идентификаторы из этой базы (или как некоторые делают - хеши от содержимого, как бонус дубликаты отлавливать)

    Этот подход самый простой для реализации и самый эффективный по затратам ресурсов сервера. Все остальные будут либо требовать больше процессора и больше времен на кодинг
    Ответ написан
    Комментировать
  • Как загрузить данные из JSON на nodejs сервере через WebSocket?

    @rPman
    https://www.npmjs.com/package/websocket
    смотри примеры client example
    Ответ написан
    Комментировать
  • Как изменить место хранения директории node_modules?

    @rPman
    попробуй что тут написали
    An alternative might be ( but more typing in the long run )
    $ cd /media/sf_shared/myproject
    $ mkdir /home/dan/myproject && npm install --prefix /home/dan/myproject
    $ NODE_PATH=/home/dan/myproject/node_modules node index.js
    Ответ написан
    Комментировать
  • Почему невозможно правильно повторить запрос из браузера?

    @rPman
    не про конкретно это но это тоже важно

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

    Так же, поставь mitm прокси и сравни ее дампы при использовании браузера и использовании твоего скрипта, как минимум обнаружишь свои ошибки

    p.s. порядок параметров в запросе тоже может быть актуальным
    Ответ написан
    Комментировать
  • Как/где лучше хранить видео(100-200гб)?

    @rPman
    Проблема не в хранении видео, 200гб это очень маленький объем, проблема в трафике.
    само по себе хранение такого объема в месяц будет стоить порядка 3$-10$ на каком-нибудь дешевом хостинге (даже с оверселингом) или любом облачном, заплатишь буквально за количество просмотров
    Ответ написан
    Комментировать
  • На что установить сервер?

    @rPman
    В конечном счете все решает стоимость решений

    Выделенный сервер (dedicated server upd или bare metal) - это буквально физический сервер, мощности которого принадлежат тебе и твоим программам
    Виртуальный сервер (virtual private server) - это когда физический сервер делят на части и продают по отдельности, что сильно дешевле, и удобнее хостеру (он может перекидывать виртуальные машины между физическими, оптимизируя нагрузку), мало того он может оверселить, продавая и обещая больше мощности чем доступно в среднем, надеясь что пиковую нагрузку сервис клиента будет давать редко а остальное время она будет низкой (так обычно и бывает), такие машины обычно самые дешевые (когда видишь предолжения ниже ~30$ это оно самое)

    Кстати нормальная практика даже для dedicated server жесткие диски заменять на NAS например iscsi, а реальный диск предлагать как опцию. Сетевые накопители обычно медленней но сильно дешевле для хостера, так как их так же можно делить, снапшотить (например за их счет делать дешевый бакап) и оверселить (а главное централизованное обслуживание, так как диски чаще всего выходят из строя).

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

    Но нужно понимать что фишки гибкой конфигурации даются не бесплатно и если у тебя постоянная нагрузка, VPS оказываются дороже dedicated server. Правильный подход кроется в комбинировании.

    И еще одна услуга у хостеров - предоставление не сервера а услуги - доступа к програмному обеспечению по какому то внутреннему алгоритму тарификации (Software As A Service). Например можно приобрести услугу http сервера (или к примеру хостинг nodejs бакэнда, отдельно базы данных, сервиса бакапов и т.п., такие точно есть), без покупки самой машины, с тарификацией по запросам, трафику или по внутренним cpu тикам, при этом пользователю не важно, сколько там в реальности задействовано серверов, хостер будет обеспечивать заказанный трафик с обещанной скоростью, только плати. Такие крупные провайдеры как гугл или амазон могут встраивать в свои прайсы на такие сервисы ловушки, не изучив и не подготовившись как следует к которым можно попасть на значительное повышение стоимости, к тому же часто такой доступ еще и привязывает клиента к конкретному провайдеру, так сильно что когда придет известность и нагрузка, может не получиться легко сменить хостера на более оптимальный.
    Ответ написан
    Комментировать
  • Как правильно построить логику приложения?

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

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

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

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

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

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

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

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

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

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