Перенаправить компонент React при отправке формы экспресс

Я пытаюсь перенаправить на React Component при отправке формы с экспресс. Это мой код:

Express.js

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

app.use(express.static(publicPath));

app.get('*', (req, res) => {
    res.sendFile(path.join(publicPath, 'index.html'))
})

app.post('/charge', (req, res) => {

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

    stripe.charges.create({
        amount: req.body.totalAmount * 100,
        currency: 'eur',
        source: req.body.stripeToken,
        description: "Example charge",
        receipt_email: req.body.receiptEmail
    }).then((charge) => {
        console.log(req.body)
    }).catch((err) => {
        console.log(err)
    })

CheckoutForm.js

    handleSubmit = (e) => {
            e.preventDefault()

            this.props.stripe.createToken({ name: this.state.name }).then(({ token }) => {
                console.log(token)
                this.stripeTokenHandler(token)
            }) 


        }

        stripeTokenHandler = (token) => {
            const form = document.getElementById('form')

            const hiddenInput = document.createElement('input')
            hiddenInput.setAttribute('type', 'hidden')
            hiddenInput.setAttribute('name', 'stripeToken')
            hiddenInput.setAttribute('value', token.id)

            form.appendChild(hiddenInput)
            form.submit()       
        }

render() {
        return (
            <div className="payment-container">    
                <form id="form" className="checkout-form" onSubmit={this.onSubmit}>

                    <label>
                        Card Number
                        <CardNumberElement
                            onChange={this.onChange}
                            style={{ base: { color: 'white' } }}
                        />
                    </label>
                    <label>
                        Titular Name
                        <input
                            type="text"
                            value={this.state.name}
                            onChange={this.handleText}
                            className="input-text"
                            placeholder="Full Name"
                        />
                    </label>
                    <label>
                        Expiration Date
                        <CardExpiryElement style={{base: {color: 'white'}}} />
                    </label>
                    <label>
                        CVC
                        <CardCVCElement style={{base: {color: 'white'}}} />
                    </label>
                    <label>
                        Email
                        <input
                            type="text"
                            value={this.state.email}
                            onChange={this.handleEmail}
                            className="input-text"
                            name="receiptEmail"
                            placeholder="Email"
                        />
                    </label>
                    <button className="btn-buy">Pay now</button>
                </form>
            </div>
        )}
}

Форма отправлена ​​правильно и зарегистрируйте платеж. Когда я представил сейчас, получает тело запроса. Как перенаправить компонент с помощью формы запроса?

2 ответа

Если вам нужно перенаправить ваш компонент после нажатия кнопки "Оплатить сейчас", то я предлагаю вам изменить <button> к <Link> компонент с использованием React Router.

Это будет выглядеть так

<Link to='/charge' className='btn-buy' onClick={this.formSubmit}>Pay Now</Link>

Затем просто удалите this.formSubmit из самой формы, так как теперь на кнопке. Он будет перенаправлять и отправлять.

Если вы хотите дождаться перенаправления после получения ответа, то в вашем formSubmit функция, после получения ответа от сервера вы можете использовать this.props.history.push('/charge') в то then часть вашего отправителя формы.

Имейте в виду, вам нужно будет import { Link } from 'react-router-dom' за это.

Надеюсь, поможет!

Другой способ справиться с этим - использовать Redirect компонент от React Router. Что-то вроде этого:

// in the route, if the post was successful
res.json({data: 'whatever data you want', success: true})
// and if it was unsuccessful
res.json({success: false})

И вот действительно урезанный компонент реагирования, чтобы пойти с ним:

class FormComponent extends Component {
  constructor() {
    super();
    this.state = {
      // inputs or whatever
      success: true,
    }
    this.handleFormSubmit = this.handleFormSubmit.bind(this)
  }

  handleFormSubmit(e) {
    e.preventDefault();
    fetch('send the data', { with: 'some options' })
      .then(res => res.json())
      .then(jsonRes => {
        const { success } = jsonRes;
        this.setState({ success });
      })
      .catch(err => console.log(err))
  }

  // assorted other stuff to handle inputs or whatever

  render() {
    return (
      <div>
        <form onSubmit={this.handleFormSubmit}>
          {/* inputs or whatever */}
        </form>
        {this.state.success && <Redirect push to='/some-other-url' />}
      </div>
    )
  }
}

Если this.state.success оценивает true, редирект будет отображаться; иначе это не будет вообще.

Это позволяет убедиться, что запрос был успешным, прежде чем перенаправить на другую страницу. Это также позволяет вам дать пользователю сообщение об ошибке, сделать что-то с тем или иным ответом, и т. Д. И т. Д. Может быть, вам нужно будет переместить состояние и так далее вверх по дереву компонентов, чтобы больше компонентов имели доступ к данным ответа, если это то, что им нужно.

Другие вопросы по тегам