Перехват SWR, не отражающий изменение базы данных

#reactjs #aws-lambda #next.js #swr

Вопрос:

Этот компонент предназначен для подсчета просмотров на уровне страницы в Next.js приложение, развернутое на AWS Lambda

 function ViewsCounter({ slug }: { slug: string }) {
  const { data } = useSWR(`/api/views/${slug}`, fetcher);
  const views = new Number(data?.total);

  useEffect(() => {
    const registerView = () =>
      fetch(`/api/views/${slug}`, { method: "POST" })
        .catch(console.log);
    registerView();
  }, [slug]);

  return (
    <>
      {views}
    </>
  );
}
 

Этот предназначен для отображения просмотров на главной странице

 function ViewsDisplay({ slug }: { slug: string }) {
  const { data } = useSWR(`/api/views/${slug}`, fetcher);
  const views = new Number(data?.total);

  return (
    <>
      {views}
    </>
  );
}
 

Хотя он работает, как ожидалось, на localhost, похоже, что он отображает только первое полученное значение и по какой-то причине не выполняет его повторную проверку.
При посещении страницы счетчик запускается правильно, и значение изменяется в БД.
Вероятно, это как-то связано с изменением, любые подсказки приветствуются.

Ответ №1:

useSWR не будет автоматически повторно извлекать данные по умолчанию.

Вы можете либо включить автоматическую повторную выборку, используя эту refreshInterval опцию.

 const { data } = useSWR(`/api/views/${slug}`, fetcher, { refreshInterval: 1000 });
 

Или явно обновите данные самостоятельно, используя мутацию после запроса POST к API.

 function ViewsCounter({ slug }: { slug: string }) {
    const { data, mutate } = useSWR(`/api/views/${slug}`, fetcher);
    const views = new Number(data?.total);

    useEffect(() => {
        const registerView = () =>
            fetch(`/api/views/${slug}`, { method: "POST" })
                .then(() => {
                    mutate();
                })
                .catch(console.log);
        registerView();
    }, [slug]);

    return (<>{views}</>);
}