Проблема с формой Gatsby Netlify, не получающей представления

Форма Netlify работает и принимает заявки, но как только я начал настраивать AJAX в соответствии с https://docs.netlify.com/forms/setup/, я не могу понять, почему не принимаются заявки.

Вещи, которые я пробовал:

  1. Удаление скрытого ввода имени формы
  2. Удаление рекапчи
  3. Чистый бег Гэтсби
  4. Удаление атрибута метода открывающего тега формы (метод: POST)
  5. Удаление атрибута действия из открывающего тега формы и установка его непосредственно в handleSubmit: .then (() = ›navigate (/ thank-you /))

Мы очень ценим любые предложения или исправления!

contact-form.js:

import React, { setState } from "react"
import styled from "styled-components"
import Recaptcha from "react-google-recaptcha"
import { navigate } from "gatsby"
import { Button, Col, Form, Row } from "react-bootstrap"
import { breakpoints } from "../utils/breakpoints"

const RECAPTCHA_KEY = process.env.GATSBY_RECAPTCHA_KEY

export default function ContactForm() {
  const [state, setState] = React.useState({})
  const recaptchaRef = React.createRef() // new Ref for reCaptcha
  const [buttonDisabled, setButtonDisabled] = React.useState(true)

  const handleChange = e => {
    setState({ ...state, [e.target.name]: e.target.value })
  }
  const encode = data => {
    return Object.keys(data)
      .map(key => encodeURIComponent(key) + "=" + encodeURIComponent(data[key]))
      .join("&")
  }
  const handleSubmit = e => {
    e.preventDefault()
    const form = e.target
    const recaptchaValue = recaptchaRef.current.getValue()

    fetch("/", {
      method: "POST",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: encode({
        "form-name": "contact",
        "g-recaptcha-response": recaptchaValue,
        ...state,
      }),
    })
      .then(() => navigate(form.getAttribute("action")))
      .catch(error => alert(error))
  }
  return (
    <Form
      name="contact"
      method="POST"
      netlify
      action="/thank-you"
      netlify-honeypot="bot-field"
      data-netlify-recaptcha="true"
      onSubmit={handleSubmit}
    >
      <Row>
        <Col md={12}>
          <h3>Message Us</h3>
        </Col>
      </Row>
      <Row>
        <Col md={6}>
          <Form.Group hidden>
            <Form.Label htmlFor="bot-field">
              Bot Field: Humans do not fill out!
            </Form.Label>
            <Form.Control name="bot-field" />
            <Form.Control name="form-name" value="contact" />
          </Form.Group>
          <Form.Group>
            <Form.Label htmlFor="first-name">First Name</Form.Label>
            <Form.Control
              required
              size="lg"
              type="text"
              name="first-name"
              onChange={handleChange}
            />
          </Form.Group>
        </Col>
        <Col md={6}>
          <Form.Group>
            <Form.Label htmlFor="last-name">Last Name</Form.Label>
            <Form.Control
              required
              size="lg"
              type="text"
              name="last-name"
              onChange={handleChange}
            />
          </Form.Group>
        </Col>
      </Row>
      <Row>
        <Col md={6}>
          <Form.Group>
            <Form.Label htmlFor="email">Email</Form.Label>
            <Form.Control
              required
              size="lg"
              type="email"
              name="email"
              onChange={handleChange}
            />
          </Form.Group>
        </Col>
        <Col md={6}>
          <Form.Group>
            <Form.Label htmlFor="phone">Phone (Optional)</Form.Label>
            <Form.Control
              size="lg"
              type="tel"
              name="phone"
              onChange={handleChange}
            />
          </Form.Group>
        </Col>
      </Row>
      <Row>
        <Col md={12}>
          <Form.Group>
            <Form.Label htmlFor="message">Message</Form.Label>
            <Form.Control
              required
              as="textarea"
              rows="3"
              placeholder="Enter your message here."
              name="message"
              onChange={handleChange}
            />
          </Form.Group>
        </Col>
      </Row>
      <Row>
        <Col md={12}>
          <FormControls>
            <Recaptcha
              ref={recaptchaRef}
              sitekey={RECAPTCHA_KEY}
              size="normal"
              id="recaptcha-google"
              onChange={() => setButtonDisabled(false)} // disable the disabled button!
              className="mb-3"
            />
            <div>
              <Button className="mr-3" type="reset" value="Eraser">
                Clear
              </Button>
              <Button type="submit" disabled={buttonDisabled}>
                Send
              </Button>
            </div>
          </FormControls>
        </Col>
      </Row>
    </Form>
  )
}
const FormControls = styled.div`
  display: flex;
  align-items: center;
  flex-direction: column;
  @media ${breakpoints.sm} {
    flex-direction: row;
    justify-content: space-between;
  }
  button[disabled] {
    cursor: not-allowed;
  }

gatsby-config:

require("dotenv").config({
  path: `.env.${process.env.NODE_ENV}`,
})
module.exports = {
  siteMetadata: {
    title: `...`,
    description: `...`,
    author: `...`,
  },
  flags: {
    DEV_SSR: false,
  },
  plugins: [
    `gatsby-plugin-gatsby-cloud`,
    `gatsby-plugin-image`,
    `gatsby-plugin-sharp`,
    `gatsby-plugin-styled-components`,
    `gatsby-plugin-typography`,
    `gatsby-plugin-react-helmet`,
    `gatsby-transformer-sharp`,     
  },
}

HTML-файл в статической папке:

<form
  data-netlify="true"
  name="contactVivaz"
  method="POST"
  data-netlify-honeypot="bot-field"
  data-netlify-recaptcha="true"
>
  <input type="text" name="first-name" />
  <input type="text" name="last-name" />
  <input type="email" name="email" />
  <input type="tel" name="phone" />
  <textarea name="message"></textarea>
  <div data-netlify-recaptcha="true"></div>
</form>

person tjhammer845    schedule 21.05.2021    source источник


Ответы (1)


Ваше управление состоянием выглядит хорошо, обязательно иметь (и проверять) входное значение скрытых полей, которое должно точно соответствовать имени формы в JSX, а также на панели инструментов Netlify. Предполагая, что все правильно названо, как кажется, я считаю, что ваша проблема связана с компонентом Form, который должен выглядеть так:

<Form
  name="contact"
  method="POST"
  action="/thank-you"
  data-netlify-honeypot="bot-field"
  data-netlify-recaptcha="true"
  data-netlify="true"
  onSubmit={handleSubmit}
>

Обратите внимание на значения data-netlify-honeypot и data-netlify.

Для добавления поля reCAPTCHA у вас есть два варианта:

  • Позволяя Netlify обрабатывать всю связанную логику, просто добавляя пустой <div>, например:

        <div data-netlify-recaptcha="true"/>
    
  • # P5 #
    # P6 #

Дополнительные ссылки для основы вашей установки:

person Ferran Buireu    schedule 22.05.2021
comment
Привет, Ферран, спасибо за предложение! Я соответствующим образом изменил свой тег формы, а также попытался изменить свое имя формы на contactVivaz и значение в скрытом поле ввода. Форма в Netlify загружает новую форму, а также отображает дополнительную защиту от спама, включенную через reCAPTCHA 2 и поле honeypot. Я все еще не уверен, но я изучу справочные ссылки и отмечу любые расхождения. - person tjhammer845; 25.05.2021
comment
Он по-прежнему не получает проверенных материалов. Есть ли другие решения, которые стоит попробовать? - person tjhammer845; 25.05.2021
comment
Попробуйте удалить рекапчу (упростите) и весь связанный с ней код и повторите попытку. - person Ferran Buireu; 25.05.2021
comment
Я удалил все ссылки на recaptcha, и это работает. Но как мне добавить рекапчу? - person tjhammer845; 25.05.2021
comment
Я просто попытался добавить файл скрытой формы html в свою статическую папку. Код ниже: ‹! - Небольшая помощь для ботов постобработки Netlify -› ‹form name = contactVivaz netlify netlify-honeypot = bot-field data-netlify-recaptcha = true hidden› ‹input type = text name = first-name / ›‹ input type = text name = last-name / ›‹ input type = email name = email / ›‹ input type = tel name = phone / ›‹ textarea name = message ›‹/textarea›‹ div data-netlify-recaptcha = true ›‹/div› ‹/form› - person tjhammer845; 25.05.2021
comment
Похоже, он попадает в сборку (ниже), но все еще не проверено или отправлено спамом. 16:52:09: Постобработка - HTML 16:52:09: Форма обработки - contactVivaz 16:52:09: Обнаруженные поля формы: 16:52:09: - bot-field 16:52:09 : - имя 16:52:09 PM: - фамилия 16:52:09 PM: - электронная почта 16:52:09 PM: - телефон 16:52:09 PM: - сообщение 16:52:09 PM: Постобработка - правила заголовка - person tjhammer845; 25.05.2021
comment
Попробуйте отредактировать свой ответ, а не вставлять его сюда, пожалуйста. Читать невозможно. Вы не добавляете переменные среды в свою панель управления Netlify (по крайней мере, не очень хорошо, они должны иметь префикс GATSBY_, чтобы Netlify мог их поймать, и, кроме того, вам необходимо отправить значение для reCAPTCHA в запросе с ключом g-recaptcha-response, поскольку вы добавляете настраиваемое поле reCAPTCHA, а не поле по умолчанию. - person Ferran Buireu; 26.05.2021
comment
Переменная окружения была объявлена ​​как константа в верхней части contact-form.js с префиксом GATSBY_. Извините за беспорядок, я не был уверен, как лучше всего поделиться этой информацией. - person tjhammer845; 26.05.2021
comment
Помимо получения переменной среды на странице, ее также необходимо установить на панели инструментов Netlify. - person Ferran Buireu; 27.05.2021