Ответы пользователя по тегу Node.js
  • Node+ts module-alias не работает с import, но работает с require?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Typescript только резолвит пути из алиасов, но не переводит их в настоящие, оставляя это за сборщиками.

    Вариант 1: собирать проект с помощью webpack или rollup (или что Вам еще нравится)
    https://www.npmjs.com/package/@rollup/plugin-alias
    https://webpack.js.org/configuration/resolve/#reso...

    Вариант 2: захачить require/import в node (в зависимости от того, что на выходе у TS), чтобы понимало Ваши алиасы
    https://nodejs.org/dist/latest-v14.x/docs/api/esm....
    Для commonjs хука нет, нужно патчить вот это: https://nodejs.org/dist/latest-v14.x/docs/api/modu...
    Ответ написан
    Комментировать
  • Как скопировать файлы в папку Nginx через Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    1. Создать новую группу пользователей
    2. Добавить в нее пользователя nginx (обычно www-data) и пользователя из под которого запускается node
    3. Назначить эту группу владельцем папки, в которую нужно писать и открыть права на запись для группы
    Ответ написан
    Комментировать
  • Как правильно загружать файлы на сервер Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Чтоб не было проблем путей в разных окружениях, всегда стройте пути с использованием переменной __dirname или других путей, полученных на ее основе.
    Для соединения нескольких частей пути в полный путь используйте path.join

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

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Так понимаю сами задачи асинхронные, но их последовательно надо выполнять.
    Обычного массива функций и промисов хватит за глаза:

    Вариант 1:
    function series(tasks) {
        return tasks.reduce((p, task) =>
            p.then(() =>
                task()), Promise.resolve());
    }
    
    series([
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
    ]);


    Вариант 2:
    async function series(tasks) {
        for (const task of tasks) {
            await task();
        }
    }
    
    series([
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
        async () => { /* ... */ },
    ]);
    Ответ написан
    Комментировать
  • __dirname is not defined?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Комментировать
  • Почему нет разницы в производительности между fork mode и cluster mode в PM2?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, cluster мод отличается от fork только тем, что умеет шарить слушаемые tcp порты между процессами. И там и там процессов будет ровно столько, сколько настроите, а значение по умолчанию - количество физических потоков (логических ядер) системы.
    Во-вторых, "двухядерный сервак с 2Гб оперативой" выглядит как виртуалка на большом сервере, где Вам выделили некоторые ресурсы. И ваши 2 ядра вполне могут быть логическими, но физически - 1 ядром или даже его половиной (если 4 потока на ядро), за счет гипертрединга. Вот только гипертрединг штука нацеленная на лучшую утилизацию ресурсов процессора при простоях, а вот при большой нагрузке он вполне себе может замедлить систему, особенно основанную на кооперативной многозадачности (асинхронном исполнении) как в ноде.
    Ответ написан
    1 комментарий
  • Стоит ли использовать везде GraphQL?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если Вы не пишите внешнее или публичное API, то GraphQL и REST - будут крайне отвратительным выбором. Они ограничивают Вас в низкоуровневом CRUD, создавая больше проблем, чем решают, а главное затрудняют выражать Ваше API в терминах доменной области.
    Посмотрите в сторону RPC протоколов, и посмотрите как элегантно на них можно описать конкретно Ваш домен. Да и выбор тут огромен: Apache Thrift, gRPC, JSON-RPC, а так же мой любимый, но почему-то малоизвестный в русскоязычном интернете E/A/?T (расшифровывается как entity/action/optional-target)
    Ответ написан
    4 комментария
  • Buffer в Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Это хранимые байты в 16-ричной системе счисления
    Ответ написан
    Комментировать
  • Какой node js фреймворк выбрать?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если прямо модно и мейнстримно, то NestJS, но он сильно завязан на TypeScript (что несомненно плюс) и декораторах (которые нестандартные, а значит, ИМХО, жирнючий минус)
    Помимо вот такого серьезного фреймворка есть микрофреймворки и библиотеки под конкретные задачи:
    Например для создания HTTP серверов есть express, он самый популярный, он под капотом у NestJS, но при не очень грамотном построении приложения легко убить производительность (тут совет использовать его роутер с первых дней)
    В качестве хороших альтернатив есть Koa и Hapi.
    Под websocket обычно все используют socket.io, из плюсов помимо популярности - его протокол реализован на многих языках, как в качестве сервера, так и клиента. В остальном, ИМХО, только минусы.
    В качестве альтернативы есть ws-api, но популярность низкая, typescript версия пока под альфой, и все не доходят руки доделать
    Ответ написан
    Комментировать
  • 300 веб сокетов?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если операции вычисления блокирующие и блокирует они поток надолго, то стоит вынести их в воркеры, само количество воркеров лучше выбрать по количеству логических ядер (хардварных потоков), а распределять задачи можно простым round robin алгоритмом, если сами задачи примерно одинаковые.
    А насчет сокетов, 300 постоянных коннектов на 1 процесс/поток для ноды сущий пустяк, она спокойно переварит несколько десятков тысяч, если поток не блокировать дольше нескольких десятков операций
    Ответ написан
    2 комментария
  • Как парсить с одинаковыми ключами?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Комментировать
  • Как использовать WSS вместо WS в Node.js?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Вариант 1 (правильный):
    1. поставить nginx или haproxy и настроить tls там
    2. настроить в nginx/haproxy реверс прокси на ноду
    3. порты ноды закрыть от внешнего мира, слушать только localhost или vlan

    Вариант 2:
    В настройках WebSocket передавать не порт, а инстанс https сервера
    https://www.npmjs.com/package/ws#external-https-server

    Ну и наконец, зачем самоподписанный сертификат, когда есть Let's Encrypt?
    Ну и записать в сертификат IP адрес не получится, нужен домен
    Ответ написан
  • Как сделать функцию показа напоминаний в определенные дату и время?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    if(!notificationShown && Date.now() < userNotificationTime) {
      showNotification();
    }
    Ответ написан
    Комментировать
  • Как мерджить(обновлять) свойства обьекта с помощью Nestjs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    function filterObjectProps<O extends Record<string, unknown>, P extends keyof O>(obj: O, props: readonly P[]) {
      const entries: [P, O[P]][] = [];
      for(const prop of props) {
        if(prop in obj) {
          entries.push([prop, obj[prop]]);
        }
      }
      return Object.fromEntries(entries) as {
        [K in P]: O[K];
      };
    }
    
    // ...
    updateItem(id: string, updateItemDto: UpdateItemDto): Item {
      const item = this.getItemById(id);
      return {
        ...item,
        ...filterObjectProps(updateItemDto, ['name', 'lastname', 'prop1', 'prop2'])
      };
    }
    Ответ написан
    1 комментарий
  • Можно ли содержимое promise записать в JSON файл?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    const fs = require('fs');
    promise.then(data => fs.promises.writeFile('/path/to/file', JSON.stringify(data)));

    И зачем столько тегов ставить? Даже npm каким то боком сюда приплели...
    Ответ написан
    6 комментариев
  • Где ошибка в коде?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    В данном коде нет данной ошибки.
    Но неплохо бы научится читать саму ошибку, а не бежать за помощью в интернет:
    TypeError: Cannot read property 'data' of undefined
    Не могу прочитать свойство data из undefined

    У Вас где-то происходит обращение к свойству data из переменной содержащей undefined
    И не просто где-то, в тексте ошибки и это есть:
    at C:\Users\Andre\Desktop\YCH cryptowallet\node_modules\node-qiwi-api\lib\callbackApi.js:759:39
    в файле C:\Users\Andre\Desktop\YCH cryptowallet\node_modules\node-qiwi-api\lib\callbackApi.js
    на строке 759 символ 39
    Вы можете зайти туда и посмотреть, а что за функцию Вы вызвали неправильно
    Ответ написан
    Комментировать
  • Как сделать команды с "похожим" текстом?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если набор возможных команд небольшой, то расстояние левенштейна Вам подойдет, с какой командой расстояние минимально - ту и подразумевал пользователь, ну и стоит вести некое пороговое значение, если все команды "дальше" этого значения, то введена бессмыслица
    Ответ написан
    Комментировать
  • Почему при повторном вызове команды массив сбрасывается?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    А какое поведение Вы ожидали от этого?
    const queue = new Map();
    let serverQueue = queue.get(message.guild.id);
    Вы создали пустую мапу и сразу же пытаетесь из нее читать.

    P.S. ключик от ютуба лучше сменить и больше не палить
    Ответ написан
  • Почему не подключается Js скрипт?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    А Вы пробовали пройти Вашу строчку по шагам?
    app.use( // 5
      express.static( // 4
        path.join( // 3
          __dirname, // 1
          'public' // 2
    )))

    1. __dirname - Содержит абсолютный путь до папки с файлом в котором выполняется (для примера пусть будет '/path/to/project')
    2. 'public' - просто строчка
    3. соединяем (1) и (2) как путь, получим '/path/to/project/public'
    4. express.static - принимает путь из (3) и создает функцию которая обрабатывает запросы и ищет им соответствие в виде файлов в указанной папке
    5. app.use - просто подключает функцию из (4) к движку express'а, без каких либо фильтров, то есть функция static обработает абсолютно все запросы которые дойдут до нее

    Теперь смотрим на шаблон, в нем прописан скрипт public/reglog.js
    Это относительный путь, то есть он автоматом соединится с путем от куда вызван
    то есть если main.hbs отрисуется в условный site.com/index.html - то скрипт запросится из
    а если main.hbs отрисуется в условный site.com/some/nested/index.html - то скрипт запросится из site.com/some/nested/public/reglog.js

    Теперь представьте, в функцию 4 попадает запрос /some/nested/public/reglog.js
    она соединяет ее с путем из (3) и получает путь /path/to/project/public/some/nested/public/reglog.js
    потом смотрит его на диске и естественно ничего не находит, ставит в express response статус 404 и отдает управление дальше в express

    для ленивых, которым готовый суп, а не разобраться почему
    <script src="/reglog.js"></script>
    Ответ написан
    1 комментарий
  • Как установить зависимости с прошлого проекта в новый package.json?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    npm i это короткий вариант npm install
    Без параметров он устанавливает зависимости из package.json и если есть файл package-lock.json, то нормализует папку node_modules по нему.
    npm i nameустановит пакет name версии отмеченной тегом latest (тэг по умолчанию)
    npm i name@tagустановит пакет name версии отмеченной тегом tag
    npm i name@5установит пакет name версии 5.x.x где x.x - последний из 5
    npm i name@5.3установит пакет name версии 5.3.x где x - последний из 5.3
    npm i name@5.3.1установит пакет name версии 5.3.1
    параметр --save или его короткий вариант -S сохранит зависимость в package.json в секции dependencies, с некоторых пор это поведение по умолчанию при наличии package.json
    параметр --save-dev или его короткий вариант -D сохранит зависимость в package.json в секции devDependencies

    А как устанавливать в Вашем конкретном случае можете решить только Вы.
    Ответ написан
    Комментировать