Почему метатеги Next.js не находят боты/сканеры?

Я использую Next.js с Typescript и MongoDB для получения данных. У меня проблемы с отображением страницы, потому что сканер не может обнаружить метатеги.

Например, поисковая система Bing сообщает, что теги Title и Meta description отсутствуют, хотя я их вижу. Может быть, это из-за axios и useState. Может ли кто-нибудь указать мне, какое должно быть решение?

Инспектор моего сайта:

Проверка URL-адреса Bing:

[пид].tsx:

import React, { useEffect, useState } from 'react'
import { useRouter } from 'next/router';
import Head from 'next/head';
import Navbar from '@/sections/Navbar';
import BlogBody from '@/sections/BlogBody';
import Footer from '@/sections/Footer';
import axios from 'axios';
import { IBlog } from '@/schema/blogSchema';
import Error from '@/components/Error';
import Loading from '@/components/Loading';

const Blog = () => {
  const _router = useRouter();
  const { pid } = _router.query;
  const [currentDoc, setCurrentDoc] = useState<IBlog | undefined>();
  const [isError, setIsError] = useState(false);

  useEffect(() => {
    if (pid !== undefined) {
      const apiAddr = `/api/queries?action=searchexact&target=${pid}`;
      axios.get(apiAddr)
        .then((res) => {
          setCurrentDoc(res.data.data[0]);
        })
        .catch((err) => {
          setIsError(true);
        })
    }
  }, [pid])

  return (
    <>
      {
        currentDoc && (
          <Head>
            <title>{currentDoc.title} - Wayne Blogs</title>
            <meta name = "description" content = {currentDoc.desc} />
            <meta name = "author" content = {currentDoc.author} />
            <link rel = "shortcut icon" href = "/favicon.svg" type = "image/x-icon" />
          </Head>
        )
      }

      <Navbar />
      <main>
        {
          isError ? (
            <Error text = "There was a problem fetching the document, please refresh the page" />
          ) : (
            currentDoc ? (
              <BlogBody blogInfo = {currentDoc} />
            ) : (
              <Loading />
            )
          )
        }

        <Footer />
      </main>
    </>
  )
}


export default Blog

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это потому, что вы извлекаете данные о клиенте внутри useEffect и только потом устанавливаете Head. В результате HTML-файл, отправленный Next.js (вы можете просмотреть его на вкладке исходного кода инструментов разработки), не будет содержать данные Head.

Рекомендуется отображать ваши Head на сервере. И для этого вы можете использовать серверную функцию выборки данных , например getServerSideProps. В вашем случае это будет похоже на:

const Blog = ({ currentDoc }) => {
  return (
    <>
      <Head>
        <title>{currentDoc.title} - Wayne Blogs</title>
        <meta name = "description" content = {currentDoc.desc} />
        <meta name = "author" content = {currentDoc.author} />
        <link rel = "shortcut icon" href = "/favicon.svg" type = "image/x-icon" />
      </Head>
      <Navbar />
      <main>
        <BlogBody blogInfo = {currentDoc} />
        <Footer />
      </main>
    </>
  );
};

export const getServerSideProps = async (context) => {
  const res = await axios.get(`/api/queries?action=searchexact&target=${context.query.pid}`);

  return {
    props: { currentDoc: res.data.data[0] },
  };
};

export default Blog;

Обратите внимание, что я не обрабатываю возможные ошибки. Я позволил тебе сделать это.

Я терял мозги, я не мог понять, почему я получаю эту ошибку ... я искал в Интернете (может быть, я не знал, что искать ... потому что я даже читал о getServerSide), я просто не понял. я программист-любитель (не квалифицированный), просто делаю все возможное, чтобы изучить NextJS. Еще раз спасибо за решение, это много значит

Ali Wayne 06.05.2023 16:36

Я понимаю. На самом деле со всеми иногда случается что-то пропустить довольно долгое время. И снова с удовольствием :)

Youssouf Oumar 06.05.2023 16:40

я все еще сталкиваюсь с той же проблемой, загрузка исправлена ​​(ваше решение сработало), но поисковые роботы не могут найти контент и метаданные страницы (если вы хотите проверить мою активную ссылку, пожалуйста, дайте мне знать)

Ali Wayne 06.05.2023 16:46

Выполнив указанные действия, убедитесь, что вы не получаете результат предыдущих тестов (иногда это может быть так, потому что ваш сервер возвращает ранее кэшированную версию или бот читает из кэша).

Youssouf Oumar 06.05.2023 16:50

Спасибо за эту потрясающую поддержку, брат, хорошо, дай мне сначала посмотреть, что я могу сделать. я свяжусь с тобой, как только снова почувствую себя обреченным

Ali Wayne 06.05.2023 16:51

Другие вопросы по теме