Задать вопрос
  • Почему ругается на свойство в типе?

    @vshvydky
    const a = {age:18, name:"alex"}
    type T =  {
      [K in keyof typeof a]: typeof a[K];
    } & {
       test: number;
    };
    
    // больше свободы 
    type TT<OB> = {
     [K in keyof OB]: OB[K];
    } & {
       test: number;
    };
    
    
    const t1: T = {test: 1, age: 1, name: 1} // ошибка
    const t2: T = {some: 1, name: "Fewfwefw" }; // ошибка
    const t3: T = {age:19, name: "ivan", test: 1 }; // корректно
    
    const tt1: TT<typeof a> = {test: 1, age: 1, name: 1} // ошибка
    const tt2: TT<typeof a> = {some: 1, name: "Fewfwefw" }; // ошибка
    const tt3: TT<typeof a> = {age:19, name: "ivan", test: 1 }; // корректно
    Ответ написан
    Комментировать
  • Как избавиться от утечки памяти в NodeJS?

    @vshvydky
    MaxListenersExceededWarning говорит о том что воможно у тебя в коде идет бесконечная подписка на событие эвент эмиттера, если это не предусмотрено по коду, потенциально это может быть утечкой памяти
    The --trace-warnings command-line flag can be used to display the stack trace for such warnings.

    The emitted warning can be inspected with process.on('warning') and will have the additional emitter, type, and count properties, referring to the event emitter instance, the event's name and the number of attached listeners, respectively. Its name property is set to 'MaxListenersExceededWarning'.


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

    @vshvydky
    по первому вопросу, нода запускается с 1 тредом отвечающим за ЭЛ. Да все задачи выполняются из очереди последовательно и та часть задач, которые требуют системных вызовов передается на исполнение в пулл уже инициализированных тредов так же через очередь, отмечу что число тредов либЮВ можно менять, согласно документации есть соответствующие ключи при запуске. Этот механизм позволяет экономить время и ресурсы на постоянную инициализацию тредов и тем самым достигается эффективность использования существующих тредов.
    На счет монопольности треда на процессор это в любом случае иллюзия, помимо процесса запущенного в ноде в системе есть еще сотни процессов чего-то еще.
    по второму процессу, кластеризация по числу ядер в целом считается оптимальной, в виду того что при большем числе экземпляров процесса будет переключение между ними, что влечет к дополнительным расходам на исполнение приложения.
    если сравнивать с пхп и тем что каждый запрос это новый тред, то плюсы ноды в том, что нет задержек на инициализацию и закрытие треда, нет избыточной конкуренции тредов, есть максимально возможное использование каждого потока через системы очередей.
    Из минусов, ресурсов ядер может не хватать и очередь будет расти, тогда кластеризация уже будет требовать распределения нагрузки по числу машин в горизонтали.
    Ответ написан
  • Как можно сделать обработку запросов извне?

    @vshvydky
    в админ странице кнопки как ссылки
    индекс принимает урл с query params /index?key=[1|2]
    разбирает что пришло, рисует нужный рендер
    Ответ написан
    Комментировать
  • Почему npm устанавливает версии пакетов отличные от указанных в package-lock.json?

    @vshvydky
    чтобы npm не пытался обновлять версии а собирал по лок файлу надо использовать команду npm ci
    Ответ написан
  • Как сделать скрипт, через сколько взломают твой пароль?

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

    @vshvydky
    чет типо этого и куча других вариантов, которые тебе прийдут в голову.
    const res = [...a, ...b, ...c] // склеили
    const logicalFunction = (acc, item)=>{
        if(acc[item.id]){
            // попытка мержа , merge напиши сам 
             acc[item.id] = merge(acc[item.id], item);
        } else {
            acc[item.id] = item;
        }
        return acc;
    }
    const obj = res.reduce(logicalFunction, {});
    const final = Object.values(obj).sort((a,b)=b.id-a.id)
    Ответ написан
    Комментировать
  • Как отправить Base64 Вк vkio?

    @vshvydky
    https://github.com/negezor/vk-io/blob/master/docs/...
    согласно документации метод upload не поддерживает base64
    если есть возможность, стоит подумать об отказе от base64
    если такой возможности нет, всегда есть возможность
    const buf = Buffer.from(b64string, 'base64');
    Ответ написан
    Комментировать
  • Почему не работает импорт родительского класса?

    @vshvydky
    base:
    export class Base {...}

    some:
    export class Some extends Base {..}
    Ответ написан
    Комментировать
  • Как получить аудио с роута, который защищён токеном?

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

    @vshvydky
    прототипы жс достаточно простая и последовательная штука.
    если сравнивать с ооп, то в ооп есть класс, в нем есть конструктор, приватные и публичные методы. (остальное опустим)
    . Так вот когда в js выполняется new SomeClass(...data) по сути инициализируется объект (экземпляр соответствующего класса)
    Описание в прототипном стиле простое, функция с именем класса исполняет роль конструктора класса. Оперирование внутри этой функции к this.anyKey отсылка к свойствам и методам.
    Объявление методов вне конструктора происходит через SomeClass.prototype.someMethod = ,,,,
    При создании экземпляра по сути создается обычный плейн объект с его внутренним состоянием
    Чтобы было чуть проще создаем пример const some = new SomeObject()
    Все динамическое, что может создать конструктор можно воспринимать как контекст плейн объекта
    Все методы, которые были объявлены в прототипе будут переданы ссылками в свойство __proto__
    Итогом такой операции будет следующее верное условие
    some.__proto__.methodName === SomeClass.prototype.methodName.
    Исходя из принципа работы контекста, любая функция (метод) вызванная в контексте того или иного объекта будет знать его динамические значения( имею ввиду значения, заданные в конструкторе, или просчитанные в рантайм).
    по теме String в window в js любая функция должна быть где-то. Глобальный объект в браузере это Window, в Node.js это global. Все что ты вызываешь без импорта доступно именно из глобального объекта. Из неоткуда в js не берется ничего.
    Исключением можно считать некоторые переменные в Node.js такие как __dirname, __filename, exports  и тп, они по сути переменные функции враппера, которая оборачивает любой импортируемый код, подробнее в доке по ноде об этом расписано.
    >>>И когда мы меняем в String.prototype что-то, получается мы меняем объект конструктора, который отвечает за тот или иной тип? ---- если ты добавляешь новый метод, ты считай расширяешь класс стринг, если заменяешь уже существующий метод на свой ты его переопределяешь. Но по сути такой механизм является мутацией существующего класса и его нельзя считать наследованием в таком виде. Хотя и наследование в прототипном стиле сделать можно.
    Ответ написан
    Комментировать
  • С чего начать изучать node.js мануальному тестировщику?

    @vshvydky
    autocannon  может помочь без изучения ноды.
    Ответ написан
    Комментировать
  • Какая правильная архитектура кода Телеграмм-бота на node-telegram-bot-api?

    @vshvydky
    то, что у бота единая точка входа, это нормально, так как у тебя есть один листенер одного типа события.
    для себя при создании подобного проекта я использовал идеи http сервера c роутом, мидлварами и хендлером обработчиком.
    По сути весь код раскладывается на файлы хендлеров, которые мапаются к тем или иным командам, пропуская между роутом и хендлером через мидлвары безопасности
    итоговая картинка может быть следующей:
    1. пишешь движок, который воспроизводит обработку всей логики для события из листенера.
    2. описываешь карту роутов из серии route.add("/start", startHandler), route.add("/get_price", authMW, getPriceHandler)
    3. описываешь сами handlers где определяешь достаточный объем входящих в функцию параметров для работы твоего бота.
    Ответ написан
    1 комментарий
  • 10 000 строчек проще рефакторить или переписать?

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

    @vshvydky
    регистрация домена вебмастером на свое имя уже сигнал, брать в заложники заказчика, работать с ним несколько лет, а потом выкручивать руки, только потому что дороги расходятся? отвратительно ж.
    Ответ написан
    2 комментария
  • Разработка: сервер - node.js, клиент - vue.js. Как совместить?

    @vshvydky
    nginx -   фронт бандл статика, апи прокси пасс на инстанс ноды (апстрим)
    Ответ написан
    Комментировать
  • Архитектура Микросервисов + Docker?

    @vshvydky
    не знаю поможет тебе или нет мой опыт, но я делал следующее
    1. репо сервиса, содержит докер файл и гитлаб сий скрипт сборки, деплой сервиса выполняет этапы сборки и тегируя нужной версией контейнер складывает его в реджистри (соответственно таких сервисов н штук)
    2. репо деплоя, ансибл который доставляет композ файл на хостовую машину, занимается пуллингом контейнеров и настройкой версий (энвироменты, которые зацеплены в композ файле) , так же через этот репозиторий я управляю энвироментами внутри самих сервисов, бренчи репозитория различаются по настройкам и отвечают за выкатку на разные стенды.
    Что мне нравится в этой архитектуре, выкатка релиза происходит единомоментно, нет ситуации когда первый апдейченый сервис уехал пол часа назад и все лежит пока не приедет последний...
    что мне не нравится, больше телодвижений чем обычно, для кластерного деплоя надо додумывать эту схему.
    Ответ написан
    Комментировать
  • Как поставить на VDS node.js телеграм бота, который работает на webhook?

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

    @vshvydky
    правильнее не юзать курл, есть fetch, got, axios , request
    Ответ написан
    Комментировать