NextJS getServersideProps()从不调用API

发布于 2025-02-10 17:18:24 字数 3232 浏览 1 评论 0原文

我创建了一个NextJS页面,并且在页面内部,有getServersideProps调用API获取数据。

问题是getServersideProps永远不会调用API并返回响应错误403未经授权

nextjs NextJS正在提供来自.next文件夹的数据,并返回JSON响应,而不是调用API,它将调用此功能url http:// localhost:3000/_next/data/development/contacts.json

这是

import React, { useState, useEffect } from "react"
import {
  Card,
  CardHeader,
  CardFooter,
  Container,
  Row,
  Button
} from "reactstrap"
import AdminLayout from "../components/layouts/AdminLayout"
import PropTypes from "prop-types"
import TablePagination from "../components/common/TablePagination"
import { fetchData } from "../api"
import { toast } from "react-toastify"
import { useSession } from "../context/SessionContext"
import ProtectPage from "../hocs/ProtectPage"
import { getContacts } from "../api/contacts"
import ContactsTable from "../components/contacts/ContactsTable"

const Contacts = ({ initialContacts, initialPagination, error }) => {
  const [contacts, setContacts] = useState(initialContacts)
  const [pagination, setPagination] = useState(initialPagination)

  const session = useSession()

  const handlePagination = async (page) => {
    fetchData({
      apiMethod: () => getContacts({ page }),
      callback: (res, error) => {
        if (error || !res) {
          toast("Error loading Contacts")
        } else {
          setContacts(res.data)
          setPagination(res.pagination)
        }
        session.loadingQueue.dequeue()
      }
    })
  }

  useEffect(() => {
    setContacts(initialContacts)
    setPagination(initialPagination)
  }, [initialContacts, initialPagination])

  return (
    <AdminLayout>
      {/* Page content */}
      <Container className="mt--7" fluid>
        <Row>
          <div className="col">
            <Card className="shadow">
              <CardHeader className="border-0">
                <Row className="justify-content-between w-100 m-0">
                  <h3 className="mb-0">Contacts</h3>
                </Row>
              </CardHeader>
              <ContactsTable contacts={contacts ?? []} />
              <CardFooter className="py-4">
                <TablePagination
                  {...pagination}
                  handlePagination={handlePagination}
                />
              </CardFooter>
            </Card>
          </div>
        </Row>
      </Container>
    </AdminLayout>
  )
}

Contacts.propTypes = {
  initialContacts: PropTypes.array.isRequired,
  initialPagination: PropTypes.object.isRequired
}

export async function getServerSideProps(ctx) {
  try {
    const contactsRes = await getContacts({})
    const { data: initialContacts, pagination: initialPagination } =
      contactsRes.data
    return {
      props: {
        initialContacts,
        initialPagination
      }
    }
  } catch (error) {
    return {
      props: {
        initialContacts: [],
        initialPagination: {},
        error: true
      }
    }
  }
}

export default ProtectPage(Contacts)

我试图禁用缓存的代码,却无效。仍在提供JSON文件。

I have created a nextjs page and inside the page, there is getServerSideProps that calls API to fetch data.

The problem is that getServerSideProps never calls API and returns a response error 403 Unauthorized

nextjs is serving data from .next folder and returns a JSON response and instead of calling API it calls this URL http://localhost:3000/_next/data/development/contacts.json

This is my code

import React, { useState, useEffect } from "react"
import {
  Card,
  CardHeader,
  CardFooter,
  Container,
  Row,
  Button
} from "reactstrap"
import AdminLayout from "../components/layouts/AdminLayout"
import PropTypes from "prop-types"
import TablePagination from "../components/common/TablePagination"
import { fetchData } from "../api"
import { toast } from "react-toastify"
import { useSession } from "../context/SessionContext"
import ProtectPage from "../hocs/ProtectPage"
import { getContacts } from "../api/contacts"
import ContactsTable from "../components/contacts/ContactsTable"

const Contacts = ({ initialContacts, initialPagination, error }) => {
  const [contacts, setContacts] = useState(initialContacts)
  const [pagination, setPagination] = useState(initialPagination)

  const session = useSession()

  const handlePagination = async (page) => {
    fetchData({
      apiMethod: () => getContacts({ page }),
      callback: (res, error) => {
        if (error || !res) {
          toast("Error loading Contacts")
        } else {
          setContacts(res.data)
          setPagination(res.pagination)
        }
        session.loadingQueue.dequeue()
      }
    })
  }

  useEffect(() => {
    setContacts(initialContacts)
    setPagination(initialPagination)
  }, [initialContacts, initialPagination])

  return (
    <AdminLayout>
      {/* Page content */}
      <Container className="mt--7" fluid>
        <Row>
          <div className="col">
            <Card className="shadow">
              <CardHeader className="border-0">
                <Row className="justify-content-between w-100 m-0">
                  <h3 className="mb-0">Contacts</h3>
                </Row>
              </CardHeader>
              <ContactsTable contacts={contacts ?? []} />
              <CardFooter className="py-4">
                <TablePagination
                  {...pagination}
                  handlePagination={handlePagination}
                />
              </CardFooter>
            </Card>
          </div>
        </Row>
      </Container>
    </AdminLayout>
  )
}

Contacts.propTypes = {
  initialContacts: PropTypes.array.isRequired,
  initialPagination: PropTypes.object.isRequired
}

export async function getServerSideProps(ctx) {
  try {
    const contactsRes = await getContacts({})
    const { data: initialContacts, pagination: initialPagination } =
      contactsRes.data
    return {
      props: {
        initialContacts,
        initialPagination
      }
    }
  } catch (error) {
    return {
      props: {
        initialContacts: [],
        initialPagination: {},
        error: true
      }
    }
  }
}

export default ProtectPage(Contacts)

I tried to disable cache and nothing worked. still serving JSON files.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

停顿的约定 2025-02-17 17:18:24

console.log(contactsres) in getserversideprops

从getServersideProps调用API(等待fetch( your_path ))

console.log(contactsRes) in getServerSideProps

Or

call your api from getServerSideProps (await fetch(your_path))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文