【问题标题】:How to avoid loading for nonexistent static pages?如何避免加载不存在的静态页面?
【发布时间】:2021-01-16 20:10:37
【问题描述】:

我正在制作电子商务 Next.js 静态应用。

对于我的产品页面,我使用增量静态生成(我将进一步称其为 ISG)和 fallback: true 和简单的 useRouter 来显示加载组件(如微调器或其他东西,没关系)。 ISG对于数据更新频繁的静态站点(如添加cmets、新产品等)非常有用,但是如果我没有产品路径(例如/products/nike-pants-12345)页面会返回“无限加载”并报错.

错误如下。

如果我们在控制台中查看,我们可以看到类似:TypeError: Cannot read property '_id' of null。这意味着应用没有找到具有请求 _id 的产品(可能是名称、slug 等)。

那么,问题是我该如何避免这种情况,是否应该完全避免这种情况?

export async function getStaticPaths() {
    await dbConnect()

    const products = await ProductModel.find({})

    const paths = products.map((doc) => {
        const product = doc.toObject()
        return {
            params: { id: product._id.toString() }
        }
    })

    /* fallback: true means that the missing pages
    will not 404, and instead can render a fallback */
    return { paths, fallback: true }
}

export async function getStaticProps({ params }) {
    await dbConnect()

    const product = await ProductModel.findById(params.id).lean()
    product._id = product._id.toString()

    // revalidate set the time (in sec) of re-generate page (it imitate SSR)
    return { props: { product }, revalidate: 30 }
}

【问题讨论】:

  • 能否提供代码
  • 您能在问题中添加getStaticProps 代码吗?您可能需要在其中明确处理这些情况。
  • 感谢您关注我的问题!我在问题的底部添加了请求的代码。
  • @juliomalves 我在问题的底部添加了请求的代码。
  • @Vince 我在我的问题中添加了代码:)

标签: reactjs next.js ssg


【解决方案1】:

使后备“阻塞”而不是真正的

【讨论】:

  • 感谢您的关注!我已经尝试过这种方式并阅读了一些关于fallback: "blocking" 的文档。这种方法解决了我的问题,但是那些等待页面而没有任何“加载”信息的用户呢?
  • 我没有关注您的担忧。你的意思是那些不想等待的用户会发生什么?对他们来说,没有任何道具被退回,这意味着,这似乎不是一个好主意。我现在对我的所有页面进行屏蔽。
【解决方案2】:

您可以通过添加对 product 的检查来触发 404 页面,如果在 getStaticProps 中未找到产品,则返回 notFound: true

export async function getStaticProps({ params }) {
    await dbConnect()

    const product = await ProductModel.findById(params.id).lean()

    if (!product) {
        return {
            notFound: true
        }
    }

    product._id = product._id.toString()

    // revalidate set the time (in sec) of re-generate page (it imitate SSR)
    return { props: { product }, revalidate: 30 }
}

【讨论】:

  • 谢谢!我很快就会检查这个技巧。但它不会伤害 ISG 吗?
  • 以什么方式?据我所知,如果您返回 404,则意味着该页面将不存在,因此不会影响其重新生成。
  • 好,我试试这个方法,在这里给个评价。
猜你喜欢
  • 2019-10-10
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2012-01-02
  • 1970-01-01
相关资源
最近更新 更多