【问题标题】:Calling the database from getStaticProps in nextjs从 nextjs 中的 getStaticProps 调用数据库
【发布时间】:2020-09-08 21:51:09
【问题描述】:

我正在看一个 nextjs 教程,导师做了一些事情,打破了我在学校学到的东西,让我陷入了思考。

他这样做了:


interface FaqProps {
  faq: FaqModel[];
}

export default function Faq({ faq }: FaqProps) {
  return (
    <div>
      {faq.map((f) => (
        <ExpansionPanel key={f.id}>
          <ExpansionPanelSummary
            expandIcon={<ExpandMoreIcon />}
            aria-controls="panel1a-content"
            id="panel1a-header"
          >
            <Typography>{f.question}</Typography>
          </ExpansionPanelSummary>
          <ExpansionPanelDetails>
            <Typography>{f.answer}</Typography>
          </ExpansionPanelDetails>
        </ExpansionPanel>
      ))}
    </div>
  );
}


export const getStaticProps: GetStaticProps = async () => {
  const db = await openDB();
  const faq = await db.all("SELECT * FROM FAQ ORDER BY createDate DESC");
  return { props: { faq } };
};

我的理解是,因为常见问题永远不会改变,我可以在构建时加载它们,调用getStaticProps。因为getStaticProps 只发生在我可以调用的服务器中 直接进入数据库。

那么,可以这样做而不是对服务器进行 fetch 调用吗? 这里的模式不是被打破了吗? 这是 Web 开发的方向还是只是这个人所做的事情?

【问题讨论】:

标签: javascript reactjs next.js


【解决方案1】:

直接引用the Next.js docs的一句话:

直接编写服务端代码

请注意,getStaticProps 仅在服务器端运行。它永远不会在客户端运行。它甚至不会包含在浏览器的 JS 包中。这意味着您可以编写诸如直接数据库查询之类的代码,而无需将它们发送到浏览器。您不应该从 getStaticProps 获取 API 路由 — 相反,您可以直接在 getStaticProps 中编写服务器端代码。

我认为已经很清楚地表明,这种模式不仅是允许的,而且是鼓励的。 getStaticProps was introduced in Next.js 9.3 and is recommended over getInitialProps 当构建时的静态生成优于运行时的服务器端渲染时。与getStaticProps 相比,getInitialProps 函数 与客户端代码捆绑在一起,可以 潜在地在浏览器中运行。

【讨论】:

  • getStaticProps 在构建时只执行一次,对吗?如果我只在构建时获取数据并且之后再也不获取数据,那么进行数据库查询有什么意义呢?还是我在这里完全遗漏了什么?
  • @Mirco 如果您的数据库中的表预计不会经常更改(即使每小时更改一次),我相信使用 Next.js 进行开发时,典型的做法是重新构建通过使用 cron 作业或其他定时服务重新启动服务器来创建静态页面。虽然前期工作似乎很多,但其目的是尽可能降低实际可被视为静态内容的 TTFB 指标。
  • 我明白了。感谢您的详细解答
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 2021-11-13
  • 2022-10-22
  • 2020-11-05
  • 2021-10-03
  • 2020-09-17
  • 2021-08-29
相关资源
最近更新 更多