Запуск useEffect только один раз

#javascript #reactjs #next.js

#javascript #reactjs #next.js

Вопрос:

Я делаю запрос с помощью NextJS, Typescript и хочу его очистить, у меня нет базы данных каждый месяц. Или проблема, с которой я столкнулся, заключается в выполнении только одного запроса, а не одного запроса для каждого рендеринга useEffect.

Основной код

 
  const { lastDayMonth, url, today } = constants
  const [history, setHistory] = useState<Data>()
  const [lastDay, setLastDay] = useState<string>(lastDayMonth)
  const [messageClearDatabase, setMessageCleanDatabase] = useState('')

  useEffect(() => {
    async function getCleanDatabase(){
      try {
        const response = await axios.get(`${url}/destroy`)
        if(response.status === 200) setMessageCleanDatabase('Banco limpo com sucesso!')
      } catch (error) {
        console.log('Erro ao limpar banco de dados')
      }
    }
    if(today === lastDay) getCleanDatabase()

  }, [])

 

Константы кода

 import moment from 'moment'
moment.locale('pt-br')

export default {
  url: 'http://localhost:8005',
  lastDayMonth: moment().endOf('month').format('DD'),
  today: moment().format('DD')
}


 

если выше указано, что если сегодня наступит последний день месяца, он очистит банк. Однако при каждом рендеринге компонента моя база данных будет удалена, поскольку она всегда будет попадать в это if. Как я могу выполнять эту функцию ТОЛЬКО один раз в день?

Комментарии:

1. вероятно, лучше всего хранить что-то на стороне сервера, которое показывает, что база данных была очищена за этот месяц. На стороне клиента не было реального надежного решения для этого. Все хранилище на стороне клиента можно легко удалить.

2. Эта реализация кажется ошибочной. Что делать, если никто не посещает ваш сайт React в последний день месяца? Тогда логика очистки базы данных никогда не будет выполняться в течение этого месяца. Это приемлемо? Эта логика принадлежит серверной части.

3. Чтобы расширить то, что сказал @andymccullough, идея о возможности последовательного запуска функции один раз в день на стороне клиента кажется… маловероятно? У пользователя должна быть активная вкладка, постоянно отображающая вашу страницу (поскольку некоторые браузеры регулируют интервалы в фоновых вкладках).

4. Создайте скрипт bash на стороне сервера и установите вкладку cron для выполнения этого скрипта один раз в месяц.