javascript - 从 POST 请求获取响应数据后,React JS 和 Axios Render

标签 javascript node.js reactjs axios stripe-payments

在 axios POST 请求后,我将如何渲染组件?我想在从 Stripe 收到成功响应后加载一个新组件。我正在尝试通过在收到响应后添加一个 setState 来更新我的组件的状态,并在状态有任何值时加载一个简单的 div。我遇到的问题是当我使用 setState 时组件没有重新呈现。

下面是我如何设置 strip 组件和 express 服务器:

import StripeCheckout from 'react-stripe-checkout';
import axios from 'axios';
import './stripe-button.styles.scss';
import { createStructuredSelector } from 'reselect';
import { selectCurrentUser } from '../../redux/user/user.selectors';
import { setCurrentUser } from '../../redux/user/user.actions';
class StripeCheckoutButton extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      cardListBacklog: []
    };
  }

  onToken = token => {
    console.log(token);
    const { cartItems, price } = this.props;
    const priceForStripe = price * 100;
    const orderSummary = cartItems.reduce(
      (cartItemAll, cartItem) =>
        (cartItemAll += cartItem.name + cartItem.quantity),
      ''
    );
    axios({
      url: 'payment',
      method: 'post',
      data: {
        amount: priceForStripe,
        order: orderSummary,
        token
      }
    })
    .then(response => {
      alert(
        `Payment successful, ${response.data.success.billing_details.name}; please check your email for your receipt.`
      );
      this.setState({cardListBacklog: response.data});
    })
    .catch(error => {
      console.log('Payment error: ', JSON.parse(error));
      alert('There was an issue with your payment. Please try again!');
    });
  };
  render() {
    const publishableKey = 'pk_test_gxxxxxxxxxxxxxxxxxxxxxxxxxxx';
    const { price } = this.props;
    const priceForStripe = price * 100;
    return (
      this.state.cardListBacklog.length
        ? 
        <div>Payment Successful</div>
       :
      <StripeCheckout
        label="Pay Now"
        name="Ltd."
        billingAddress
        shippingAddress
        image="https://i.imgur.com/vWgUzv.png"
        description={`Your total is $${price} USD`}
        amount={priceForStripe}
        panelLabel="Pay Now"
        token={this.onToken}
        stripeKey={publishableKey}
        label="Pay with 💳"
      />
    );
  }
}


export default StripeCheckoutButton;


这是我的 Server.js:


  const express = require('express');
  const cors = require('cors');
  const bodyParser = require('body-parser');
  const path = require('path');

  if (process.env.NODE_ENV !== 'production') require('dotenv').config();

  const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

  const app = express();
  const port = process.env.PORT || 5000;

  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: true }));

  app.use(cors());

  if (process.env.NODE_ENV === 'production') {
    app.use(express.static(path.join(__dirname, 'client/build')));
    app.get('*', function(req, res) {
      res.sendFile(path.join(__dirname, 'client/build', 'index.html'));
    });
  }

  app.listen(port, error => {
    if (error) throw error;
    console.log('Server running on port: ' + port);
  });

  app.post('/payment', (req, res) => {
    const body = {
      source: req.body.token.id,
      amount: req.body.amount,
      receipt_email: req.body.token.email,
      description: req.body.order,
      currency: 'usd'
    };

    stripe.charges.create(body, (stripeErr, stripeRes) => {
      if (stripeErr) {
        res.status(500).send({ error: stripeErr });
      } else {
        res.status(200).send({ success: stripeRes });
      }
    });

  });

最佳答案

this.state.cardListBacklog.length

这就是问题所在。更新前为 0,更新后为 undefined。控制台日志并检查其是否为真。

this.state = {
  cardListBacklog: false
};

  this.setState({cardListBacklog: true});

应该可以解决问题。

关于javascript - 从 POST 请求获取响应数据后,React JS 和 Axios Render,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59011406/

相关文章:

node.js - Websocket 在使用 AWS ELB 的连接 Node 服务器空闲 60 秒后关闭

javascript - 如何使用 react 以多步形式进行验证

javascript - React 组件必须在层次结构中吗?

javascript - Magento 可配置产品下拉菜单 - 必须将 "Price Difference - +"更改为实际价格

javascript - 客户端和服务器端编程有什么区别?

Javascript 访问嵌套元素

javascript - axios获取多个JSON端点并保存到状态(react)

javascript - 需要有关 ajax 请求的帮助

javascript - Nodejs异步 waterfall 使用外部所需的javascript文件中的函数

node.js - 使用自定义方法扩展 ExpressJS/Response 对象的正确方法是什么?