使用 getServerSideProps 获取内部 API? (下一个.js)

2024-01-02

我是 Next.js 的新手,我正在尝试理解建议的结构并处理页面或组件之间的数据。

例如,在我的页面内home.js,我获取一个名为的内部 API/api/user.js它从 MongoDB 返回一些用户数据。我正在通过使用来做到这一点fetch()从内部调用API路由getServerSideProps(),经过一些计算后将各种道具传递到页面。

根据我的理解,这对 SEO 很有好处,因为道具是在服务器端获取/修改的,并且页面让它们准备好渲染。但后来我在 Next.js 文档中读到你不应该使用fetch()到所有 API 路由getServerSideProps()。那么我应该怎么做才能遵守良好的实践和良好的 SEO?

我没有进行所需计算的原因home.js在 API 路由本身中,我需要来自此 API 路由的更多通用数据,因为我也会在其他页面中使用它。

我还必须考虑缓存,客户端非常简单地使用 SWR 来获取内部 API,但服务器端我还不确定如何实现它。

home.js:

export default function Page({ prop1, prop2, prop3 }) {
        // render etc.
}

export async function getServerSideProps(context) {
  const session = await getSession(context)
  let data = null
  var aArray = [], bArray = [], cArray = []
  const { db } = await connectToDatabase()

  function shuffle(array) {
    var currentIndex = array.length, temporaryValue, randomIndex;
    while (0 !== currentIndex) {
      randomIndex = Math.floor(Math.random() * currentIndex);
      currentIndex -= 1;
      temporaryValue = array[currentIndex];
      array[currentIndex] = array[randomIndex];
      array[randomIndex] = temporaryValue;
    }
    return array;
  }

  if (session) {
    const hostname = process.env.NEXT_PUBLIC_SITE_URL
    const options = { headers: { cookie: context.req.headers.cookie } }
    const res = await fetch(`${hostname}/api/user`, options)
    const json = await res.json()
    if (json.data) { data = json.data }

    // do some math with data ...
    // connect to MongoDB and do some comparisons, etc.

但后来我在 Next.js 文档中读到你不应该使用fetch()到所有 API 路由getServerSideProps().

您想直接使用 API 路由中的逻辑getServerSideProps,而不是调用您的内部 API。那是因为getServerSideProps就像 API 路由一样在服务器上运行(从服务器向服务器本身发出请求是没有意义的)。您可以从文件系统读取或直接访问数据库getServerSideProps。请注意,这仅适用于对内部 API 路由的调用 - 从以下位置调用外部 API 是完全可以的:getServerSideProps.

来自 Next.jsgetServerSideProps https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props#getserversideprops-or-api-routes文档:

当您想要获取数据时,很容易会尝试使用 API 路由 来自服务器的数据,然后调用该 API 路由getServerSideProps。这是一种不必要且低效的方法, 因为这会导致因两者而提出额外的请求getServerSideProps以及在服务器上运行的 API 路由。

(...) 相反,直接导入 API 路由中使用的逻辑 进入getServerSideProps。这可能意味着调用 CMS、数据库或 直接从内部获取其他 APIgetServerSideProps.

(注意使用时同样适用getStaticProps/getStaticPaths methods https://stackoverflow.com/a/66206394/1870780)


这是一个小的重构示例,允许您从 API 路由中重用逻辑getServerSideProps.

假设您有这个简单的 API 路线。

// pages/api/user
export default async function handler(req, res) {
    // Using a fetch here but could be any async operation to an external source
    const response = await fetch(/* external API endpoint */)
    const jsonData = await response.json()
    res.status(200).json(jsonData)
}

您可以将获取逻辑提取到一个单独的函数中(仍然可以将其保留在api/user如果你愿意的话),它仍然可以在 API 路由中使用。

// pages/api/user
export async function getData() {
    const response = await fetch(/* external API endpoint */)
    const jsonData = await response.json()
    return jsonData
}

export default async function handler(req, res) {
    const jsonData = await getData()
    res.status(200).json(jsonData)
}

而且还允许您重复使用getData函数于getServerSideProps.

// pages/home
import { getData } from './api/user'

//...

export async function getServerSideProps(context) {
    const jsonData = await getData()
    //...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 getServerSideProps 获取内部 API? (下一个.js) 的相关文章

随机推荐

  • 从 ADT 16 更新到 ADT 17 后出现 ClassNotFound 错误

    我的应用程序运行良好 但是一旦我从 ADT 16 更新到 ADT 17 我就会收到此错误 Unable to resolve superclass of Lcom my app MyActivity 130 Link of class Lc
  • 创建虚拟列并从其他列输入值

    我有包含主题列表 主题 1 5 0 表示未分配主题 及其值的数据 我想为每个主题创建一个新列并用值填充该列 这是桌子的样子 reviewId topic value 01 2 4 02 2 9 03 0 7 04 5 1 05 1 38 我
  • Visual Basic 与 Android 兼容吗?

    如果用VB写的东西与android兼容吗 如果是的话 你能给我一些文件吗 不 您不能在 Android 上使用 Visual Basic 编写的程序 安卓使用java 你会得到的最接近的是安卓单声道 http android xamarin
  • 如何在 Windows 上使用 .Net 构建 iPhone 应用程序?

    是否有任何工具 模拟器 IDE 可以帮助您在 Windows 上使用 Net 开发 iphone 应用程序 然后发布到 iTunes Mono http www mono project com Mono Iphone正在努力将他们的 Ne
  • AuthorizeAttribute 和 IAuthenticationFilter 之间的区别

    在 ASP Net Web API 2 Owin 中 有什么区别IAuthenticationFilter and AuthorizeAttribute 目前我已经通过创建自己的来实现我的授权AuthorizeAttribute像这样 pu
  • 在 PHP 中获取两个日期之间的日期名称

    如何在 PHP 中获取两个日期之间的天数 Input 开始日期 2013 年 1 月 1 日结束日期 2013 年 5 月 1 日 Output Tuesday周三周四 Friday周六 尝试过代码 from date 01 01 2013
  • 无法在 Visual Studio 2015 中发布

    自从安装 Visual Studio 2015 Professional Update 3 以来 https www visualstudio com en us news releasenotes vs2015 update3 vs ht
  • ActionMailer 密码安全

    我是疯了 还是将 ActionMailer 的 SMTP 用户名和密码保留在实际 开发 生产 配置文件中是一个坏主意 看来我应该将其存储在一个加密的地方 或者至少将其从我的 Mercurial 推送中排除 现在 我只是在执行推送之前从源文件
  • 框架之间如何通信?

    我正在维护一个类似这样的应用程序 页面 A 带有显示页面 B 的框架 现在页面 B 是单独域中完全不同产品的一部分 现在 他们希望当单击 B 中的选项时 整个页面会重定向到 A 中的另一个页面 问题是 A 的 url 类似于www clie
  • 如何在 iOS 项目中正确配置 Realm DB 文件 (.realm) 的路径?

    对不起我的英语不好 我开发了一个需要自己的本地数据存储的移动应用程序 我选择 Realm 作为数据库管理系统 在研究 Realm 文档的过程中 我对数据库设计 规范化 CRUD 操作以及与代码直接相关的所有内容没有任何问题 我跟着一头雾水
  • Spring Boot 中的多个 WebSecurityConfigurerAdapter 用于多种模式

    我正在尝试为我的项目设置多个 WebsecurityConfigurerAdapter 其中 Spring Boot Actuator API 使用基本身份验证进行保护 所有其他端点都使用 JWtAuthentication 进行身份验证
  • AttributeError:模块“matplotlib.pyplot”没有属性“axline”

    我有个问题 这是文档 https matplotlib org stable gallery pyplots axline html sphx glr gallery pyplots axline py https matplotlib o
  • 如何判断我的“IDisposable”类型何时尚未显式处置?

    It s 很难找到 https stackoverflow com questions 3097145 resharper custom search pattern to warn idisposable objects在设计 编译时类型
  • 内容的右边缘被居中 div 中的垂直滚动条覆盖

    我想创建一个居中弹出窗口 其中包含标题和其下的一张或多张卡片 每张卡片都包含一个小桌子 当卡片数量超出可显示范围时 会出现垂直滚动条 但有一个问题 垂直滚动条覆盖了卡片的右边缘 该行为取决于浏览器 Chrome 刷新页面时出现此问题 调整页
  • 有没有办法让 VS code 与 git worktree 一起工作? (带有 WSL 的 Windows)

    我喜欢在多个工作树中继续签出存储库git worktree轻松地同时在不同的分支上工作 然而 当 git 位于 git worktree 文件夹中时 VS code 似乎无法将 git 识别为 scm 我在文档中找不到有关此内容或扩展的任何
  • 更新框架按钮在 Xcode 8.1 中消失

    更新到 8 1 8B62 后 界面生成器右下角的 解决自动布局问题 快捷方式中不再有用于更新情节提要 xib 中的框架的按钮 我听说过要在新奇的触摸栏上放置这样一个按钮 但这对于像我这样的凡人来说意味着什么 我必须开始使用菜单栏吗 Now
  • Azure CLI 2:如何在 az group deployment create 命令中提供参数?

    我在 Windows 计算机上使用 Azure CLI 2 0 并尝试使用以下命令创建 Docker VMthis https learn microsoft com nl nl azure virtual machines virtual
  • autoindent 是 vim 中 smartindent 的子集吗?

    帮助自动缩进 开始新行时从当前行复制缩进 键入 在插入模式下或使用 o 或 O 命令时 帮助智能缩进 开始新行时进行智能自动缩进 适用于 C 类语言 程序 但也可用于其他语言 通常 使用 smartindent 时也应启用 autoinde
  • 多模块项目中的 Spring 配置

    我是 Spring 新手 遇到了一种情况 即单个项目具有多个模块 包括一个 Web 模块 Web模块使用Spring MVC 但我想知道是否可以在项目级别拥有主要的Spring配置来照顾整个项目 以便我可以充分利用Spring框架 main
  • 使用 getServerSideProps 获取内部 API? (下一个.js)

    我是 Next js 的新手 我正在尝试理解建议的结构并处理页面或组件之间的数据 例如 在我的页面内home js 我获取一个名为的内部 API api user js它从 MongoDB 返回一些用户数据 我正在通过使用来做到这一点fet