Информация о группе Закрытая

parus-majour

Список участников
  • RE: Проблема с дублированием данных при вызове return вместо reply.send - Fastify

    Пользователь @kirilljs написал в Проблема с дублированием данных при вызове return вместо reply.send - Fastify:

    const userService = new UserService();

    Лучше не создавать сервис каждый раз в функции, это лишние затраты

    написал в Fastify
  • RE: Проблема с дублированием данных при вызове return вместо reply.send - Fastify

    Во первых ты описал createNewUser() как асинхронную функцию, и она у тебя ничего не возвращает, а также ты нигде await не используешь, у тебя тогда и try не будет ничего ловить

    Попробуй вместо userRepository.save(user) написать асинхронную функцию простую (например таймер), и сделай там console.log(), посмотри сколько сообщений выдаст, сделай такой дебаггинг

    написал в Fastify
  • RE: pm2 автоматический restart при перезагрузки сервера

    Пользователь @kirilljs написал в pm2 автоматический restart при перезагрузки сервера:

    Далее нам необходимо запустить скрипт startup, который как раз отвечает за автоматический запуск pm2 после перезагрузки сервера:

    Поправка: команда startup просто показывает команду, при исполнении которой сервис pm2 будет загружать автоматически сохраненные процессы

    написал в Бекенд | Разработка серверов
  • PageProps Type Errors in Next.js. Type '{ slug: string; }' is missing the following properties from type 'Promise<any>'

    После обновления Next js до 15 версии, в динамических маршрутах разработчики некоторые изменения, что приведет к ошибкам при сборке проекта.

    пример:

    Type error: Type 'Props' does not satisfy the constraint 'PageProps'.
      Types of property 'params' are incompatible.
        Type '{ slug: string; }' is missing the following properties from type 'Promise<any>': then, catch, finally, [Symbol.toStringTag]
    

    Разработчики сделали динамические параметры асинхронными, поэтому нужно будет поменять типы, и получать их мы должны, например, через await

    до 15 версии:

    
    // СТАРЫЙ КОД
    type Props = {
      params: {
        slug: string;
      };
    };   
    
    export async function generateMetadata({ params: { slug } }: Props) {
      const { category } = await fetchData(slug);
    
      ...
      }
    }
    
    export default async function Page({ params: { slug } }: Props) {
      const  data = await fetchData(slug);
    
      ...
    }
    

    после 15 версии:

    // НОВЫЙ КОД
    type Props = {
      params: Promise<{
        slug: string;
      }>;
    };  
    
    export async function generateMetadata(props: Props) {
      const { slug } = await props.params;
      const { category } = await fetchData(slug);
      ...
      }
    }
    
    export default async function Page(props: Props) {
      const { slug } = await props.params;
      const  data = await fetchData(slug);
      ...
    }
    

    Источник

    написал в NextJs errors reactjs
  • RE: Оптимизация React js приложений. Использование функции debounde()

    @kirilljs

    Пользователь @kirilljs написал в Оптимизация React js приложений. Использование функции debounde():

    И почему onInput, а не onChange

    onInput отлавливает все изменения значения в <input />, даже такие как нажатие клавиш и вставку текста, поэтому он предпочтительнее в данном случае

    написал в React
  • RE: Оптимизация React js приложений. Использование функции debounde()

    Пользователь @kirilljs написал в Оптимизация React js приложений. Использование функции debounde():

    Простыми словами, мы колбэчим submitHandler через debounceHandler то как оно должно быть по спецификации JS

    не понял вопроса, напомню, чтчо тут не используется никаких форм, фактически все обработчики привязаны к onInput событию, функция debounce() - самописная

    написал в React
  • Оптимизация React js приложений. Использование функции debounde()

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

    Пример кода

    
    // функция иммитации запроса на сервер
    function fakeFetch(val: string) {
      return new Promise<string>(function (resolve) {
        setTimeout(function () {
          resolve(`Сервер получил сообщение: ${val}`);
        }, 1000);
      });
    }
    
    //  самый простой пример компонента
    function App() {
      const [val, setVal] = useState('');
      const [response, setResponse] = useState('');
    
      const inputHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
        setVal(e.target.value);
        setResponse('');
      };
    
      const submitHandler = async () => {
        setVal('');
        setResponse('отправка ...');
        const resp = await fakeFetch(val);
        setResponse(resp);
      };
    
      return (
        <>
          <input type="text" value={val} onInput={inputHandler} />
          <button onClick={submitHandler}>Отправить</button>
          <p>{response}</p>
        </>
      );
    }
    

    Теперь перед нами встала задача заменить поведение: отправлять данные не по кнопке, а автоматически. Однако мы не может просто так повесить функцию в обработчик inputHandler(), мало того что он будет неоправданно часто отправлять запросы на сервер, так еще и будет сбивать значение val. Но если мы добавить функцию debounce(), то она решит эти вопросы.

    Функция debounce()

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

    пример:

    function debounce(func, delay: number) {
      let timeoutId: number;
    
      return (...args) => {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => func(...args), delay);
      };
    }
    

    Как правильно использовать в React компоненте

    function App() {
      const [val, setVal] = useState('');
      const [response, setResponse] = useState('');
    
      const inputHandler = (e: React.ChangeEvent<HTMLInputElement>) => {
        setVal(e.target.value);
        setResponse('');
    
        debounceHandler();
      };
    
      const submitHandler = useCallback(async () => {
        setResponse('отправка ...');
        const resp = await fakeFetch(val);
        setVal('');
        setResponse(resp);
      }, []);
    
      const debounceHandler = useMemo(() => {
        return debounce(submitHandler, 800);
      }, [submitHandler]);
    
      return (
        <>
          <input type="text" value={val} onInput={inputHandler} />
          {/* <button onClick={submitHandler}>Отправить</button> */}
          <p>{response}</p>
        </>
      );
    }
    

    При изменении стейта функциональный компонент вызывает свою функцию каждый раз, и без мемоизации мы бы получали каждый раз новый обработчик debounceHandler() и submitHandler(). Но для того чтобы все работало нам необходимо передать одну функцию в debounce один раз!

    Поэтому мемоизируем submitHandler() через useCallback (линтер обычно потребует указать submitHandler как зависимость debounceHandler) и саму функцию debounceHandler() в useMemo, (т.к debounce() возвращает функцию)

    написал в React
  • Создание пользователя и базы данных, настройка доступов, установка пароля

    Сначала необходимо войти в систему как суперпользователь базы данных на сервере postgresql. Опять же, самый простой способ подключиться в качестве пользователя postgres — это перейти на пользователя postgres unix на сервере базы данных с помощью команды su следующим образом:

    $ su postgres
    

    Далее заходим в среду PostgreSQL

    $ psql
    

    В случае успеха вы должны увидеть следующее:

    postgres=#
    

    В командной строке PostgreSQL создайте базу данных, имя пользователя и пароль, а затем предоставьте весь доступ этому новому пользователю. Например:

    CREATE DATABASE {database};
    CREATE USER {user} WITH PASSWORD 'password';
    GRANT ALL ON DATABASE {database} TO {user};
    

    выходим из среды PostgreSQL

    $ \q 
    

    профит!

    написал в PostgreSQL