Задать вопрос
Ответы пользователя по тегу Node.js
  • Использование PDFium через WASM в Node.js и альтернативы для анализа метаданных PDF?

    @rPman
    W в абривиатуре WASM это Web, и оно имеет смысл (но понятно не ограничивается) только в браузере, потому что ничего иного в нем нет или не безопасно для пользователя (как с java applet или activex ранее). На сервере же (у вас же nodejs это на бакэнде) доступны вызовы нативных приложений, используйте их и не городите себе лишних прослоек типа WASM (это все же виртуализация, так или иначе)
    Ответ написан
    Комментировать
  • Как отдельным потоком постоянно отправлять сообщения в WebSocket клиенту?

    @rPman
    Для параллельных тяжелых вычислений нужно использовать воркеры или к примеру модуль child_process
    Ответ написан
    Комментировать
  • Как правильно прописать конфигурацию данные Postgres в Node js?

    @rPman
    имена переменных бери из строки:
    const connectionString = `postgresql://${process.env.POSTGRES_USER}:${process.env.POSTGRES_PASSWORD}@${process.env.POSTGRES_HOST}:${process.env.POSTGRES_PORT}/${database}`;

    Хост у тебя судя по скрину - localhost, в крайнем случае используй то что возвращает консоль по команде hostname

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

    @rPman
    Список юзеров получаем с бэкенда. Для этого нужно установить и запустить локально сервер.
    т.е. у тебя УЖЕ есть сервер и тебе его просто запустить, открываешь документацию по этому серверу и работаешь (ее должны были написать те кто делал этот сервер), либо, если документации нет, изучаешь весь код

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

    p.s. есть практика размещать все необходимое для запуска приложения в настройках пакета, тогда запуск будет что то типа:
    npm install
    npm build
    npm run-script start

    Т.е. install установит и обновит зависимости проекта, build запустит скрипты подготовки и оптимизации (например webpack), в общем что указано разработчиками, ну и запуск run-script start

    И конечно, если это сделать в каталоге проекта в терминале, то закрытие терминала все закроет автоматически, поэтому это нужно будет прописать в виде сервиса systemd или каким то другим способом, принятом в твоей ОС
    Ответ написан
    Комментировать
  • Как проверить наличие слова в файле 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. порядок параметров в запросе тоже может быть актуальным
    Ответ написан
    Комментировать