Задать вопрос
Ответы пользователя по тегу Node.js
  • Почему возникает ошибка при загрузке csv?

    @rPman
    Приведенный код не сохраняет в формате csv, так как нет корректной обработки строковых полей, многострочных например.

    Советую не изобретать паровоз, а воспользоваться какой-нибудь готовой библиотекой типа csv-writer (не проверял но заявлена поддержка по rfc)
    Ответ написан
    2 комментария
  • Использование 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
    Ответ написан
    Комментировать