Next.js , Ответ Strapi — Fetch пуст

#javascript #reactjs #fetch #next.js #strapi

#javascript #reactjs #выборка #next.js #strapi

Вопрос:

У меня есть интерфейс nextjs, который извлекает данные из серверной части strapi. Проблема в том, что данные пусты, даже если я вижу в журналах разработчиков strapi, что запрос был сделан.

Это next.js код

 import { useRouter } from "next/router";
import React, { useEffect } from "react";

const Room = () => {
  const router = useRouter();
  let fetchData;

  useEffect(() => {
    if (router.asPath !== router.route) {
      getDataNames();
    }
  }, [router]);

  const getDataNames = () => {
    try {
      fetch("http://localhost:1337/rooms?_id="   router.query.id)
        .then((response) => response.json())
        .then((data) => (fetchData = data));
      console.log(fetchData);
    } catch (e) {
      console.error(e);
    }
  };

  return (
    <div>
      <p>{router.query.id}</p>
      <p>{fetchData}</p>
    </div>
  );
};

export default Room;
 

И вот журнал strapi

 [2021-02-23T14:06:20.845Z] debug GET /rooms?_id=6034aac1ba63472e9878ed25 (27 ms) 200
 

Но я не знаю, почему данные пусты.
Правда в том, что ответ состоит из длинного текста base64, но я не уверен, может ли это вызвать проблему.
Заранее спасибо за любую помощь.

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

1. использовать состояние, а не переменную

Ответ №1:

fetch и заданное состояние являются асинхронными, поэтому ваш код будет console.log(fetchData); доступен, пока выполняется выборка и заданное состояние.

Если вы добавите другой useEffect для when fetchData is changed, вы увидите обновленное значение.

 useEffect(() => {
  console.log(fetchData);
}, [fetchData]);
 

Ответ №2:

 const Room = () => {
  const router = useRouter();
  //let fetchData;
  const [fetchData, setFetchData] = React.useState('');
  useEffect(() => {
    if (router.asPath !== router.route) {
      getDataNames();
    }
  }, [router]);

  const getDataNames = () => {
    try {
      fetch("http://localhost:1337/rooms?_id="   router.query.id)
        .then((response) => response.json())
        .then((data) => { setFetchData(data); });
      console.log(fetchData);
    } catch (e) {
      console.error(e);
    }
  };

  return (
    <div>
      <p>{router.query.id}</p>
      <p>{fetchData}</p>
    </div>
  );
};
 

Вы можете использовать useState перехват для состояния реакции.