Пользователь @kirilljs написал в Проблема с дублированием данных при вызове return вместо reply.send - Fastify:
const userService = new UserService();
Лучше не создавать сервис каждый раз в функции, это лишние затраты
Пользователь @kirilljs написал в Проблема с дублированием данных при вызове return вместо reply.send - Fastify:
const userService = new UserService();
Лучше не создавать сервис каждый раз в функции, это лишние затраты
Во первых ты описал createNewUser()
как асинхронную функцию, и она у тебя ничего не возвращает, а также ты нигде await не используешь, у тебя тогда и try не будет ничего ловить
Попробуй вместо userRepository.save(user)
написать асинхронную функцию простую (например таймер), и сделай там console.log(), посмотри сколько сообщений выдаст, сделай такой дебаггинг
Пользователь @kirilljs написал в pm2 автоматический restart при перезагрузки сервера:
Далее нам необходимо запустить скрипт startup, который как раз отвечает за автоматический запуск pm2 после перезагрузки сервера:
Поправка: команда startup просто показывает команду, при исполнении которой сервис pm2 будет загружать автоматически сохраненные процессы
После обновления 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);
...
}
Пользователь @kirilljs написал в Оптимизация React js приложений. Использование функции debounde():
И почему onInput, а не onChange
onInput отлавливает все изменения значения в <input />
, даже такие как нажатие клавиш и вставку текста, поэтому он предпочтительнее в данном случае
Пользователь @kirilljs написал в Оптимизация React js приложений. Использование функции debounde():
Простыми словами, мы колбэчим submitHandler через debounceHandler то как оно должно быть по спецификации JS
не понял вопроса, напомню, чтчо тут не используется никаких форм, фактически все обработчики привязаны к onInput событию, функция debounce()
- самописная
Допустим мы имеем очень абстрактный компонент, который имеет поле ввода текста, кнопку отправки этого текста на сервер, и сообщение о состоянии отправки данных на сервер
// функция иммитации запроса на сервер
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() - это функция-обертка, которая ограничивает число выполнений переданной в нее функции, некоторым промежутком времени. Если точнее, то, пока промежуток времени не прошел, то зарегистрированная функция не будет исполнятся, а пока она не исполнилась, новый вызов функции будет замещать старый, исключая повторное выполнение.
пример:
function debounce(func, delay: number) {
let timeoutId: number;
return (...args) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(() => func(...args), delay);
};
}
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() возвращает функцию)
Сначала необходимо войти в систему как суперпользователь базы данных на сервере 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
профит!