【问题标题】:Fetch returns undefined - Express and ReactFetch 返回 undefined - Express 和 React
【发布时间】:2020-09-09 12:48:31
【问题描述】:

我正在关注条带教程(来自条带) - 但是在发布请求时从我的服务器返回一个未定义的值。你能帮我弄清楚我在哪里搞砸了吗?

首先,当用户点击支付按钮时,它会触发“joinClass()”函数。

    const joinClass = async (youtubeId) => {

    const { data: clientSecret } = await fetch('/payment_intents', {
        method: 'POST',
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({amount: costPerClass * 100})
    })

    console.log(clientSecret)
    //Returns Undefined

}

这是服务器上的路由 - 它可以工作,但不会发送回 client_secret。

app.post('/payment_intents', async (req, res) => {
try {
    const { amount } = req.body
    const paymentIntent = await stripe.paymentIntents.create({
        amount, 
        currency: "usd"
    })

    console.log(paymentIntent.client_secret)
    //Logs to key correctly.

    res.status(200).send(paymentIntent.client_secret);

} catch (error) {
    res.status(500).json({statusCode: 500, message: 'error'})
}

})

我是否在服务器的回调函数中错误地使用了 async/await?我尝试了几种不同的方法,但它仍然返回未定义。

我解构了函数的名称 (const { data: clientSecret } =.... 就像他们在视频中所做的那样。也许这就是问题所在?

*刚刚尝试了以下 - 没有成功

const joinClass = async (youtubeId) => {

    const data = await fetch('/payment_intents', {
        method: 'POST',
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify({amount: costPerClass * 100})
    })
    console.log(data)
    //Returns Response 200
    const dataResponse = await data.json()
    console.log(dataResponse)
    //Uncaught in promise

}

【问题讨论】:

  • 也许可以试试const data = await fetch()console.log(data) 以及console.log(data.json())。它记录了什么?
  • 更新了我的问题以尝试这两件事 - 我从等待数据中得到响应 200。等待 data.json() 返回未捕获的承诺。
  • 返回响应 200,但它是否返回您需要的任何 data?和dataResponse一样,你需要什么数据吗?
  • 否 - 都不返回我从服务器发送的 clientSecret 密钥。
  • 你能链接到你正在学习的教程吗?

标签: reactjs express async-await stripe-payments


【解决方案1】:

后端在/payment_intents响应中发回了一个简单的文本字符串,所以在前端接收数据时你会想要使用response.text()方法(而不是response.json()):

https://developer.mozilla.org/en-US/docs/Web/API/Body/text

例如:

const response = await fetch("/payment_intents", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ amount: costPerClass * 100 }),
});

const clientSecret = await response.text();

演示本身使用 axios 而不是 fetch,它有一点不同的 API:https://github.com/axios/axios

【讨论】:

  • 感谢您的帮助!真棒知道。我最终只使用了 axios,它完美地工作。我没有意识到 axios 所做的不仅仅是让编写它更容易一些。你能推荐我把它改回标准的 fetch 库吗?
  • 这完全取决于你!两者都运行良好,而 fetch api 具有作为本机 web api 的优势。总的来说,我发现 axios 更容易使用,而且还有其他一些优点:github.com/axios/axios/issues/314#issuecomment-217346581
猜你喜欢
  • 2019-08-04
  • 2018-02-28
  • 2021-07-02
  • 1970-01-01
  • 2019-11-03
  • 2016-06-28
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多