• В чём прикол модулей NestJS?

    @dimuska139
    Backend developer
    Этот декоратор по сути описывает то, от каких модулей зависит текущий модуль, какие в нём контроллеры и сервисы есть - то есть, грубо говоря, описание модуля что ли, его конфигурация. А сам по себе модуль - это совокупность какой-либо логики (сервисов, контроллеров), объединённых по смыслу (находящиеся в одной папке). Что что-то вроде приложений в Django внутри проекта, если имели дело с этим. Это нужно, чтобы проект в кашу не превращался. То есть в вашем случае users и products - это два разных модуля.
    Ответ написан
    Комментировать
  • Как определить истинный IP пользователя с Opera VPN?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    Вебсокет

    конечно, негарантировано
    Ответ написан
    Комментировать
  • Какой node js фреймворк выбрать?

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

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    "Произведения искусства" на плагинах Вордпресса не делаются.
    Нажмите F12 и изучайте исходники, волшебных библиотек не существует.
    Ответ написан
    Комментировать
  • Как выстроить CI/CD для одного разработчика и нескольких проектов?

    @vitaly_il1
    DevOps Consulting
    Build & deploy - Gitlab CI/CD https://docs.gitlab.com/ee/ci/.

    Как выстроить staging?
    Я бы сделал на отдельном сервере с теми же портами
    Ответ написан
    Комментировать
  • Как запустить несколько сайтов на одном хосте, так чтоб у каждого был свой набор Docker контейнеров и чтоб они были доступны по одному 80 порту?

    Используй traefik в качестве балансировщика. Nginx каждого приложения светить наружу не надо. На руду смотрит только traefik. Что и куда проксировать описывается в labels сервиса в docker-compose
    Ответ написан
    Комментировать
  • Как запустить Promis-ы последовательно?

    Seasle
    @Seasle Куратор тега JavaScript
    const createPromiseLoop = promises => {
      let index = 0;
      
      const attach = (...args) => {
        promises[index++](...args)
          .then((...args) => attach(...args));
        
        index %= promises.length;
      };
      
      return (...args) => {
        attach(...args);
      };
    };
    
    const sleep = (duration = 0) => new Promise(resolve => setTimeout(resolve, duration));
    
    const loop = createPromiseLoop([
      (number) => new Promise(async resolve => {
        await sleep(100);
        console.log(`Number plus one. Received: ${number}`);
        resolve(number + 1);
      }),
      (number) => new Promise(async resolve => {
        await sleep(100);
        console.log(`Number multiply two. Received: ${number}`);
        resolve(number * 2);
      }),
    ]);
    
    loop(1);
    /*
    'Number plus one. Received: 1'
    'Number multiply two. Received: 2'
    'Number plus one. Received: 4'
    'Number multiply two. Received: 5'
    'Number plus one. Received: 10'
    'Number multiply two. Received: 11'
    'Number plus one. Received: 22'
    'Number multiply two. Received: 23'
    'Number plus one. Received: 46'
    'Number multiply two. Received: 47'
    'Number plus one. Received: 94'
    'Number multiply two. Received: 95'
    'Number plus one. Received: 190'
    'Number multiply two. Received: 191'
    'Number plus one. Received: 382'
    'Number multiply two. Received: 383'
    'Number plus one. Received: 766'
    'Number multiply two. Received: 767'
    'Number plus one. Received: 1534'
    'Number multiply two. Received: 1535'
    'Number plus one. Received: 3070'
    'Number multiply two. Received: 3071'
    'Number plus one. Received: 6142'
    'Number multiply two. Received: 6143'
    'Number plus one. Received: 12286'
    'Number multiply two. Received: 12287'
    'Number plus one. Received: 24574'
    */

    И код никогда не остановится.
    Ответ написан
    4 комментария
  • Возможно ли задать timeout для fetch?

    ruddy22
    @ruddy22
    Спасение утопающих — дело рук самих утопающих
    Самый простой вариант
    const get = timeout => url => 
      Promise.race([
        fetch(url),
        new Promise((resolve, reject) =>
          setTimeout(() => reject(new Error('timeout')), timeout)
        )
      ]);

    Вариант с AbortController
    Ответ написан
    4 комментария
  • Как работает подход Unit of Work?

    @Flying
    Unit of Work - это паттерн определяющий логическую транзакцию т.е. атомарную синхронизацию изменений в объектах, помещённых в объект UoW с хранилищем (базой данных).

    Если обратиться к исходному описанию этого паттерна у Мартина Фаулера - то видно что объект, реализующий этот паттерн отвечает за накопление информации о том какие объекты входят в транзакцию и каковы их изменния относительно исходных значений в хранилище. Основная работа производится в методе commit() который отвечает за вычисление изменений в сохранённых в UoW объектах и синхронизацию этих изменений с хранилищем (базой данных).

    Паттерн Unit of Work как правило не является полностью самостоятельным, он обычно тесно связан с паттерном Identity Map, задача которого - сохранение карты созданных объектов, взятых из хранилища с тем чтобы гарантировать что одна единица информации из хранилища представлена ровно одним экземпляром объекта данных в приложении. Это позволяет избежать конфликтов изменений т.к. не допускает ситуации когда два объекта, представляющих один и тот же элемент данных в хранилище, изменены по-разному. Информация из Identity Map используется в методе commit() паттерна Unit of Work для вычисления разницы между исходными данными и накопленными изменениями.

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

    Также, если данные в хранилище не являются независимыми (к примеру связи между таблицами в базе данных) - может потребоваться реализации ряда паттернов, отвечающих за сохранение информации о связях между данными (это паттерны раздела Object-Relational Structural Patterns в каталоге паттернов).

    Подводя итог: сам по себе Unit of Work довольно прост в своём внешнем интерфейсе, но реализация его корректной работы требует предоставления множества дополнительных данных, поэтому миниатюрных примеров привести не могу.

    Если говорить о PHP - то лучшей реализацией этих паттернов на PHP безусловно является Doctrine ORM. В частности в разделе Working with Objects документации Doctrine можно найти хорошее описание и множество примеров использования паттернов, описанных выше.
    Ответ написан
    6 комментариев
  • Есть ли ресурс со скриптами быстрой установки различных Linux-серверов?

    @q2digger
    никого не трогаю, починяю примус
    есть, называется ansible , ролей для установки всего на свете написано людьми добрый - сколько угодно.
    Ответ написан
    Комментировать
  • Как работать в symfony env в продакшне?

    glaphire
    @glaphire
    PHP developer
    В самой документации написано, что нет преимущества проброса env через сервер по сравнению с .env файликом на проде

    Most Symfony applications read their configuration from environment variables. While developing locally, you'll usually store these in .env and .env.local (for local overrides). On production, you have two options:

    Create "real" environment variables. How you set environment variables, depends on your setup: they can be set at the command line, in your Nginx configuration, or via other methods provided by your hosting service.
    Or, create a .env.local file just like your local development (see note below)
    There is no significant advantage to either of the two options: use whatever is most natural in your hosting environment.

    https://symfony.com/doc/current/deployment.html#b-...
    Ответ написан
  • Как отправить почту на NodeJS со своего домена, не используя сторонних сервисов?

    Robur
    @Robur
    Знаю больше чем это необходимо
    для этого вам нужен какой-нибудь smtp-сервер на вашем сервере. Не обязательно полноценный, главное чтобы мог отправлять сообщения.
    Например postfix.
    В целом это имеет мало отношения к nodejs, и отдельная большая область, как поставить, настроить, сделать так чтобы письма с этого сервера уходили куда надо, чтобы не попадали в спам, настройка днс и так далее.
    как это все заработает, в nodejs берете nodemailer и указываете в настройках транспорта адрес вашего почтового сервера.
    Ответ написан
    2 комментария
  • Какой фреймворк на Node.js выбрать сегодня?

    adelkhalitov
    @adelkhalitov
    >
    Серве я бы для любого проекта сейчас брал nestjs, я работаю на 2х преоктах, которые начали делалать 5+ лет назад. И самая большая проблема в том, что разработчики делают так как хотят, каждый разработчик это новый стиль написания кода, причем в 99% случаях этот код малорасширяем, приходится постоянно рефакторить. У нест есть крутая структура, которую пока не знаю как можно поломать, в доку указаны все рекомендации.

    Есть крутой ОРМ, реализация будет очевидна для любого разраба если почитать доку.
    Ответ написан
    2 комментария
  • Как сделать клон Udemy?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    Комментировать
  • Можно ли написать функцию, которая проверяет существует ли переменная или нет (js)?

    @Interface
    Дисклеймер: так как вопрос скорее теоретический, я не стараюсь предоставить "адекватное" решение.
    Конечно, все это нельзя использовать в реальном проекте!


    Интересный вопрос.

    Начнем с того, что определимся насколько критично сохранить сигнатуру функции? В зависимости от этого, решения можно поделить на 2 категории:
    - где допускается изменение сигнатуры
    - где сигнатура должна быть строго такой и никакой иначе

    Также есть ряд решений, подразумевающий предобработку кода тем или иным путем.

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


    Сначала рассмотрим несколько решений с изменением сигнатуры: они попроще и в каком-то смысле более логичны.

    есть как минимум 2 категории решений с изменением сигнатуры:
    - функция будет принимать строку
    - функция будет принимать функцию

    При этом проблема того, что все падает до попадания в функцию, пропадает сама собой.

    вот несколько решений:

    1) класс решений построенный на анализе кода в рантайме:
    решение заключается в том, что вызываемая функция анализирует свой код (а также код функции которая вызвала ее и т.д.)
    https://stackoverflow.com/questions/2051678/gettin... вот тут есть частчный разбор такого решения.
    Приводить его в виде кода я не буду :)

    Плюсы:
    - вроде как решает задачу
    - сигнатура изменилась не сильно
    Минусы:
    - крайне жирное решение с точки зрения производительности
    - сигнатура не та, что просили
    - нельзя использовать 'use strict', так как решения возможно будут завязаны на arguments.callee.caller

    Уровень безумия: достаточно безумное

    2) решение построенное на том, что приниматься будет функция:
    isExists(() => someVar); // такая будет сигнатура

    Это решение хоть и меняет сигнатуру, но ее возможно сохранить максимально подобной желаемой

    Одна из возможных реализаций:
    function isExists(someVarFn){
        try {
            someVarFn();
        } catch(e) {
            if (e instanceof ReferenceError) {
                return false;
            }
            throw e;
        }
        return true;
    }

    Примеры использования:
    function f1() {
        let x;
        console.log(isExists(() => x)); //  => true
        console.log(isExists(() => y)); //  => false
    }
    
    function f2() {
        let x;
        console.log(isExists(() => x)); //  =>  true
        console.log(isExists(() => y)); //  => false
    }
    
    f1();
    f2();


    Плюсы:
    - плюс-минус адекватная производительность
    - довольно компактно
    Минусы:
    - несильно меняется сигнатура функции
    - api получается несколько не очевидным

    Уровень безумия: почти адекватное

    3) решения с использованием eval:
    Суть похожа на решение #2, но с другим api:
    function isExists(varName, fn){
        return fn(`(()=>{
            try {
                const nop = ${varName};
            } catch(e) {
                if (e instanceof ReferenceError) {
                    return false;
                }
                throw e;
            }
            return true;
        })()`);
    }
    
    function f1() {
        let x;
        console.log( isExists('x', c => eval(c)) ); //  => true
        console.log( isExists('y', c => eval(c)) ); //  => false
    }
    
    function f2() {
        let y;
        console.log( isExists('x', c => eval(c)) ); //  =>  false
        console.log( isExists('y', c => eval(c)) ); //  => true
    }
    
    f1();
    f2();


    Плюсы:
    - сложнее чем в №2 передать какую-то фигню
    Минусы:
    - сигнатура отлиается сильнее и уродливей
    - сложнее / жирнее / больше чем №2

    Уровень безумия: безумненько

    Решения с сохранением сигнатуры:

    4) магия es6 Proxies + with
    класс решений строится на стратегии: слушать доступ к глобальному объекту и если он происходит и в нем нет переменной с таким именем - такой переменной нет:
    const pseudoUndefined = {};
    
    const scopeTrap = new Proxy(window, {
        has() {return true},
    
        get(target, prop) {
            if (prop in window) {
                return window[prop];
            } else {
                return pseudoUndefined;
            }
        }
    })
    
    function isExists(someVar) {
        return someVar !== pseudoUndefined;
    }
    
    // весь код использующий функцию должен быть обернут в такой with :(
    with (scopeTrap) {
    
        let y;
        console.log( isExists(x) ); //  =>  false
        console.log( isExists(y) ); //  => true
    
    }


    Плюсы:
    - мы сохранили желаемую сигнатуру! Ура!
    Минусы:
    - теперь вместо исключения будет получаться что-то совсем левое. Хорошего дебагга! :D
    - накладные расходы производительности
    - все нужно обернуть в with
    - необходима поддержка es6+

    Уровень безумия: с точки зрения реализации - задача подъемная. использовать в бою - а вы знаете толк!

    Решения с предобработкой:

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

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

    Плюсы: ...
    Минусы: ...
    (Без комментариев)

    Уровень безумия: я думаю все понятно
    ...

    есть и более сдержанные решения, например, используя compile-time можно оптимизировать предыдущие решения:

    6) можно используя парсер составить дерево областей видимости (хэш-таблица [функция <-> список переменных]), привязать каждую область к функции, через позицию в исходном коде (возможно придется сохранять дополнительную информацию). А дальше все это интегрировать с решением №1.

    В итоге:

    Плюсы относительно (#1):
    - относительно хорошая производительность
    Минусы:
    - сложно
    - дорого
    - требует compile-time

    Уровень безумия: стало еще безумнее, чем было :)

    7) написать (или найти) плагин для babel'я (или чего-то другого), который будет трансформировать доступ к переменным в особую функцию

    Плюсы относительно (#1):
    - достигнут результат
    Минусы:
    - требует поддержки
    - требует compile-time
    - упадет производительность (вероятнее всего существенно)

    Уровень безумия: буднечно безумное
    Ответ написан
    3 комментария
  • Callback / Promises / await - что быстрее и экономичнее?

    Xuxicheta
    @Xuxicheta
    инженер
    Да, есть небольшой оверхэд от промисов, но выгоднее писать понятный код и купить плюс одну виртуалку, чем экономить на спичках и утонуть в аде коллбэков

    1*I5Zr32SJK0Aic3Ru7EU1KQ.png

    Если у вас там ничего сложного, используйте коллбеки, в разумном масштабе ничего страшного. Но обычно, если требования к скорости суровы, берут не js, а компилируемый язык модный типа golang или модуль на C/C++ пишут.
    Ответ написан
    24 комментария
  • Бесплатный виртуальный сервер?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Бесплатный сыр только в мышеловке. Вам на вскидку 100 рублей на Амазон жалко?
    Ответ написан
    Комментировать
  • Как они автоматически генерируют эти картинки?

    @ghostiam
    На Go писатель, серверов пинатель.
    Ответ написан
    Комментировать