Я изучаю информацию о получении данных с серверного компонента в Next.js, и нашел материал <a href="https://nextjs.org/docs/app/building-your-application/data-fetching/fetching" rel="nofollow">здесь</a>. У меня есть следующий компонент: <pre><code class="javascript">import classNames from "classnames/bind"; import style from './style.module.scss' import Image from "next/image"; import ProductItem from "@/components/product-item"; import Link from "next/link"; const cn = classNames.bind(style) const getData = async () => { const response = await fetch("http://localhost:9000/api/cart/qty"); const qty = await response.json(); } export default async function MainPage() { const data = await getData(); return ( <div className={cn('main-page')}> <div className={cn('title-section')}> <div className={cn('title')}> <p> Уникальные изделия кубачинских мастеров </p> {/*{qty.qty}*/} </div> </div> <div className={cn('features')}> <div className={cn('item')}> <Image src={'/heart.png'} alt={'индивидуальный подход'} width={50} height={50}/> <span>Индивидуальный подход</span> </div> <div className={cn('item')}> <Image src={'/hot-air-balloon.png'} alt={'индивидуальный подход'} width={50} height={50}/> <span>Доставка по всей России</span> </div> <div className={cn('item')}> <Image src={'/diamond-ring.png'} alt={'индивидуальный подход'} w...<br/></pre> Как правильно извлечь и отобразить полученные данные в этом компоненте?
Ваше понимание получения данных с серверного компонента в Next.js верное, но вам немного нужно его доработать, чтобы корректно извлечь и отобразить полученные данные. Ваша функция `getData` должна возвращать данные, чтобы их можно было использовать в компоненте. Попробуем немного изменить ваш код: ```javascript import classNames from "classnames/bind"; import style from './style.module.scss' import Image from "next/image"; import ProductItem from "@/components/product-item"; import Link from "next/link"; const cn = classNames.bind(style) const getData = async () => { const response = await fetch("http://localhost:9000/api/cart/qty"); // Убедитесь, что ответ успешен if (!response.ok) { throw new Error('Ошибка сети'); } const qty = await response.json(); return qty; // Возвращаем полученные данные } export default async function MainPage() { const data = await getData(); // Получаем данные const qty = data.qty; // Извлекаем нужное значение return ( <div className={cn('main-page')}> <div className={cn('title-section')}> <div className={cn('title')}> <p> Уникальные изделия кубачинских мастеров </p> {/* Отображаем количество */} <p>Количество в корзине: {qty}</p> </div> </div> <div className={cn('features')}> <div className={cn('item')}> <Image src={'/heart.png'} alt={'индивидуальный подход'} width={50} height={50}/> <span>Индивидуальный подход</span> </div> <div className={cn('item')}> <Image src={'/hot-air-balloon.png'} alt={'доставка'} width={50} height={50}/> <span>Доставка по всей России</span> </div> <div className={cn('item')}> <Image src={'/diamond-ring.png'} alt={'качество'} width={50} height={50}/> <span>Высокое качество</span> </div> </div> </div> ); } ``` ### Основные изменения 1. **Возвращение данных**: В функции `getData` добавлено `return qty;`, чтобы данные могли быть извлечены в компоненте. 2. **Проверка состояния ответа**: Добавлена проверка на успешность ответа с помощью `response.ok`. Если ответ не успешен, выбрасывается ошибка, которую вы можете обработать в UI (например, показать сообщение об ошибке). 3. **Отображение данных**: В компоненте `MainPage` добавлен JSX для отображения количества товаров в корзине. Теперь после вызова `getData`, вы сможете корректно извлечь и отобразить `qty` на странице, и данные будут отображаться при рендере компонента.
У тебя getData() возвращает промис и ты его пытаешься зарендерить в jsx, из-за чего получаешь ошибку
Вот так должно быть:
import classNames from "classnames/bind"; import style from './style.module.scss' import Image from "next/image"; import ProductItem from "@/components/product-item"; import Link from "next/link"; const cn = classNames.bind(style) const getData = async () => { const response = await fetch("http://localhost:9000/api/cart/qty"); if (!response.ok) { throw new Error("Failed to fetch data"); } return await response.json(); } export default async function MainPage() { const data = await getData(); return ( <div className={cn('main-page')}> <div className={cn('title-section')}> <div className={cn('title')}> <p> Уникальные изделия кубачинских мастеров </p> {/* Используем полученные данные */} <p>{data.qty}</p> </div> </div> <div className={cn('features')}> <div className={cn('item')}> <Image src={'/heart.png'} alt={'индивидуальный подход'} width={50} height={50} /> <span>Индивидуальный подход</span> </div> <div className={cn('item')}> <Image src={'/hot-air-balloon.png'} alt={'индивидуальный подход'} width={50} height={50} /> <span>Доставка по всей России</span> </div> <div className={cn('item')}> <Image src={'/diamond-ring.png'} alt={'индивидуальный подход'} width={50} height={50} /> <span>300+ изделий</span> </div> <div className={cn('item')}> <Image src={'/shopping-store.png'} alt={'индивидуальный подход'} width={50} height={50} /> <span>Наш магазин открыт с 2003 года</span> </div> </div> <div className={cn('products-catalog')}> {[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12].map((el) => ( <Link className={cn('product-item-link')} href={`/jewellery-catalog/${el}`} key={el}> <ProductItem /> </Link> ))} </div> </div> ) }