Netlify 404 при отправке формы с Гэтсби - PullRequest
1 голос
/ 17 апреля 2020

У меня есть компонент формы, который я повторно использую на веб-сайте, этот компонент принимает имя формы в качестве параметров. Сайт построен с использованием Gatsby и размещен на Netlify.

Всякий раз, когда я пытаюсь заполнить форму и нажимаю кнопку отправки, в консоли появляется ошибка 404, форма не отправляется, но я вижу все формы в формах Netlify. Я не уверен, где моя ошибка, когда я проверяю в chrome, я вижу, что атрибут data-netlify="true" отсутствует в моем интерфейсе, но он есть в коде.

Мои функции

import React, { useState } from "react"
import { useForm } from "react-hook-form"

function encode(data) {
  return Object.keys(data)
    .map((key) => encodeURIComponent(key) + "=" + encodeURIComponent(data[key]))
    .join("&")
}

const ContactForm = ({ data, name, type, index }) => {
  const { register, handleSubmit, errors, reset } = useForm({
    mode: "onBlur",

  })

  const [feedbackState, setFeedbackState] = useState(null)
  const [errorState, setErrorState] = useState(null)
  const [requestType, setRequestType] = useState(null)
  const [state, setState] = useState({})

  const handleChange = (e) => {
    {
      setState({ ...state, [e.target.name]: e.target.value })
    }
  }
  const onSubmit = (data, e) => {
    e.preventDefault()
    fetch("/", {
      method: "POST",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: encode({
        "form-name": {name},
        ...state,
      }),
    })
      .then((response) => {
        setFeedbackState(true)
        reset()
      })
      .catch((error) => {
        setErrorState(true)
      })
  }

Моя форма:

if (feedbackState) {
    return (
      <div className="callout success">
        <h3>Vad roligt att du är intresserad av våra produkter!</h3>
        <p>
          Vi kommer höra av oss inom kort till {state.fName} {state.lName} på{" "}
          {state.email}.
        </p>
      </div>
    )
  } else {
    return (
      <>
        {console.log("form navn er, ", name)}
        <form
          id="contactMe"
          onSubmit={handleSubmit(onSubmit)}
          name={name}
          method="post"
          data-netlify="true"
          data-netlify-honeypot="bot-field"
        >
          <input type="hidden" name="form-name" value={name} />
          <div hidden>
            <label>
              Don’t fill this out:{' '}
              <input name="bot-field" onChange={handleChange} />
            </label>
          </div>          <fieldset class="grid-x grid-margin-x">
            <legend class="cell">
              <h3>{data.formTitle}</h3>
            </legend>

            <div class="cell medium-6">
              <div class="form-field">
                <label htmlFor="fName">
                  {data.firstName}
                  <span
                    id="error-required-field"
                    style={{
                      display:
                        errors.fName && errors.fName.type === "required"
                          ? "block"
                          : "none",
                    }}
                  >
                    {data.firstNameRequired}
                  </span>
                  <span style={{ display: "none" }}>
                    <label>Request type: </label>
                    <input
                      type="text"
                      id="requestType"
                      onChange={handleChange}
                      name="requestType"
                      value={type}
                      ref={register({ required: true })}
                    />
                  </span>
                </label> ....more form values

Пример того, как я могу обработать мою форму, можно увидеть здесь, я попробовал console.logging all Приписан внутри моей формы и может видеть их всех

<ContactForm
    name="Tilgjenlighetsanalys"
    data={data.auditsForm}
    type="Liten analys"
  />

Есть идеи о том, что я делаю неправильно?

Редактировать: я вижу на своей вкладке chrome сеть, когда я отправляю форму, имя формы устанавливается как [объект объекта] вместо фактического имени формы screenshot ov chrome dev tools network tab showing form name as object Object

1 Ответ

0 голосов
/ 17 апреля 2020

Выяснилось, что я не мог просто передать данные так, как я это делал, Chrome инструменты разработчика показывали имя формы как [Object, object] вместо имени, которое я получил, когда я console.logged, передало значение name. Для того, чтобы это исправить, я строчил имя

Эта строка решила мою проблему:

  const formName = JSON.stringify(name);

Затем в моей форме я передаю значение как нормальную переменную

  <input type="hidden" name="form-name" value={formName} />

РЕДАКТИРОВАТЬ: Этот метод имеет большой недостаток все имена теперь передаются в кавычках. Если у кого-то есть лучший метод, пожалуйста, опубликуйте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...