如何从 getstaticprops 函数中的 Context API 获取数据?

Posted

技术标签:

【中文标题】如何从 getstaticprops 函数中的 Context API 获取数据?【英文标题】:How to get data from Context API in getstaticprops function? 【发布时间】:2021-06-11 11:07:04 【问题描述】:

我正在为我的静态电子商务 Next.js 应用程序制作支付功能。

对于付款,我有几个阶段:

    制作带有送货信息表单和按钮“支付”的购物车页面,该页面重定向到/payment 页面; 在/payment 页面上,我连接了我的支付服务,需要从 Context API 获取购物车信息,但我无法在 getStaticProps 中使用 Context API,这是我的问题。支付页面只需获取购物车数据并重定向到外部服务支付表单。

页面/payment的代码如下:

import  useEffect, useContext  from "react"
import QiwiBillPaymentsAPI from "@qiwi/bill-payments-node-js-sdk"

import  CartContext  from "@/context/GlobalState"

export default function Payment ( payUrl ) 
    useEffect(() => window.location.assign(payUrl))
    return (
        <span>Redirect</span>
    )



export async function getStaticProps() 
    const qiwiApi = new QiwiBillPaymentsAPI(process.env.QIWI_SECRET_KEY)

    const  state, dispatch  = useContext(CartContext)
    const  cart  = state

    const billId = qiwiApi.generateId()
    const lifetime = qiwiApi.getLifetimeByDay(1);
    const fields = 
        amount: 1.00,
        currency: "RUB",
        expirationDateTime: lifetime,
    

    const payment_data = await qiwiApi.createBill( billId, fields )
    const payUrl = payment_data.payUrl

    return  props:  payUrl 

请帮我出出主意。

【问题讨论】:

getStaticProps 在构建时在服务器上运行。您将无法访问其中的任何运行时或客户端逻辑。另外,如果您似乎没有使用getStaticProps 中的购物车数据,为什么还需要访问上下文?你不能在你的Payment 组件中处理上下文吗? 我从您的代码中注意到一件事,您使用的是window.location.assign,在这种情况下这可能是一个好主意。但我担心你对所有事情都使用相同的东西。确保您使用next router。否则,您将完全退出 SPA 并使用 Next.js @云海 感谢您的关注!是的,我只在这种情况下使用window.location.assign。我一直在寻找使用next router 的方法,但我做不到。如果你知道,请告诉我! @juliomalves 我需要在 getStaticProps 中有上下文 api 访问权限,以便在字段对象中更改 amount(未来付款的总价)等等。出于某种原因,我无法在 Payment 组件中使用 qiwiApi,我在 useEffect 或只是在函数中尝试了它,但在不起作用并返回错误并返回 'fs'。 我建议您将 getStaticProps 代码移动到 API 路由,然后从您的 Payment 组件向该 API 路由发出请求,使用上下文中您需要的任何内容。 【参考方案1】:

可能的解决方案!

我使用 getStaticProps 函数中的代码创建了 API Route(它获取总价并查询支付服务,然后返回支付 URL)。 api路由代码如下:

import QiwiBillPaymentsAPI from "@qiwi/bill-payments-node-js-sdk"

export default async function handler(req, res) 
    const  
        query:  total ,
     = req

    const qiwiApi = new QiwiBillPaymentsAPI(process.env.QIWI_SECRET_KEY)
    const billId = qiwiApi.generateId()
    const lifetime = qiwiApi.getLifetimeByDay(1);
    const fields = 
        amount: total,
        currency: "RUB",
        expirationDateTime: lifetime,
    

    const payment_data = await qiwiApi.createBill( billId, fields )
    const payUrl = payment_data.payUrl

    res.json( url: payUrl )

然后是 /payment 页面代码(查询我的 API 路由并获取付款 url,然后重定向到付款表单):

export default function Payment () 
    const  state, dispatch  = useContext(CartContext)
    const  cart  = state

    const fetcher = (...args) => fetch(...args).then(res => res.json())

    const  data, error  = useSWR(`/api/qiwi-pay?total=$cart.total`, fetcher)

    if (error) return <div>failed to load</div>
    if (!data) return <div>loading...</div>

    window.location.assign(data.url)

    return (
        <>
            <span>Redirect to payment form.</span>
        </>
    )

这种方法效果很好!

【讨论】:

以上是关于如何从 getstaticprops 函数中的 Context API 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

NextJS:通过上下文将字符串从输入传递到 getStaticProps

如何从`getStaticProps`向API路由发出请求

在 getStaticProps 函数中序列化 Next.js 时出错?

错误:如何从 getStaticProps 序列化数据:Next.js

如何从 getStaticProps 返回重定向而不从 TypeScript 出错?

从 getStaticProps 迭代对象并在组件模板中显示