Сборка React - «Объекты недопустимы как дочерние элементы React» - PullRequest
0 голосов
/ 10 февраля 2019

Я работаю над проектом Expressjs для обслуживания сборки React (с npm run build).Всякий раз, когда я работаю над проектом React, он прекрасно работает.Я получаю сообщение об ошибке, когда я собираю проект и обслуживаю его с помощью express.static('build').

. У меня есть форма контакта, когда я нажимаю Отправить , страница становится пустой и отображается ошибкаконсоль инструментов разработчика:

Инвариантное нарушение: "ошибка Minified React # 31; посетите https://reactjs.org/docs/error-decoder.html?invariant=31&args[]=object%20with%20keys%20%7Bname%2C%20data%2C%20stage%7D&args[]= для полного сообщения или используйте неминифицированную среду dev для получения полных ошибок и дополнительных полезных предупреждений. "

На этой странице я получаю разобранную ошибку:

Объект недопустим как дочерний элемент React (найдено: объект с ключами {name, data, stage})

У меня есть компонент Contacto.js, где:

import React, { Component } from "react";
import ReCAPTCHA from "react-google-recaptcha";
import "./Contacto.css";

const Validator = require("validator");
const queryString = require("query-string");

const errores = {
  nombre: {
    vacio: "El nombre es obligatorio"
  },
  apellido: {
    vacio: "El apellido es obligatorio"
  },
  email: {
    vacio: "El correo electrónico es obligatorio",
    invalido: "El correo electrónico es inválido"
  },
  telefono: {
    vacio: "El teléfono es obligatorio"
  },
  asunto: {
    vacio: "El asunto es obligatorio"
  },
  mensaje: {
    vacio: "El mensaje es obligatorio"
  },
  captcha: "El captcha es obligatorio"
};

class Contacto extends Component {
  constructor(props) {
    super(props);

    this.state = {
      error: false,
      texto: {},
      alert: {
        tipo: ""
      },
      captcha: "",
      captchaSiteKey: "<captcha key>",
      captchaTestSiteKey: "<captcha test key>"
    };
    this.checkField = this.checkField.bind(this);
    this.enviarCorreo = this.enviarCorreo.bind(this);
    this.setCaptcha = this.setCaptcha.bind(this);
  }

  checkField(e) {
    let errors = { ...this.state.texto };

    if (Validator.isEmpty(e.target.value)) {
      if (typeof errores[e.target.id].vacio != "undefined") {
        errors[e.target.id] = <p>{errores[e.target.id].vacio}</p>;
      } else {
        errors[e.target.id] = <p>{errores[e.target.id]}</p>;
      }
    } else {
      delete errors[e.target.id];
    }

    if (Object.keys(errors).length < 1) {
      this.setState(
        Object.assign(this.state, {
          error: false
        })
      );
    }

    this.setState(Object.assign(this.state, { texto: errors }));
  }

  enviarCorreo(evt) {
    evt.preventDefault();

    const data = {
      nombre: evt.target.elements.nombre.value,
      apellido: evt.target.elements.apellido.value,
      email: evt.target.elements.email.value,
      telefono: evt.target.elements.telefono.value,
      asunto: evt.target.elements.asunto.value,
      mensaje: evt.target.elements.mensaje.value
    };

    let errors = {};

    if (Validator.isEmpty(data.nombre)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.nombre = <p>{errores.nombre.vacio}</p>;
    }

    if (Validator.isEmpty(data.apellido)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.apellido = <p>{errores.apellido.vacio}</p>;
    }

    if (Validator.isEmpty(data.email)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.email = <p>{errores.email.vacio}</p>;
    } else if (!Validator.isEmail(data.email)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.email = <p>{errores.email.invalido}</p>;
    }

    if (Validator.isEmpty(data.telefono)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.telefono = <p>{errores.telefono.vacio}</p>;
    }

    if (Validator.isEmpty(data.asunto)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.asunto = <p>{errores.asunto.vacio}</p>;
    }

    if (Validator.isEmpty(data.mensaje)) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.mensaje = <p>{errores.mensaje.vacio}</p>;
    }

    if (!this.state.captcha.length) {
      this.setState(Object.assign(this.state, { error: true }));
      errors.captcha = <p>{errores.captcha}</p>;
    }

    if (this.state.error) {
      this.setState(
        Object.assign(this.state, {
          texto: errors,
          error: false,
          alert: {
            tipo: "alert-danger"
          }
        })
      );
    } else {
      this.setState(
        Object.assign(this.state, {
          error: false
        })
      );

      const options = {
        method: "POST",
        headers: {
          "Content-Type": "application/x-www-form-urlencoded"
        },
        body: queryString.stringify(data)
      };
// If I remove the following block of code, the error is not being displayed.
      (async () => {
        let response = await fetch(
          `${window.location.origin}/contacto`,
          options
        );
        let data = await response.json();

        if (!data.success) {
          this.setState({
            error: true,
            texto: { error: <p>{data.message}</p> },
            alert: {
              tipo: "alert-danger"
            }
          });
        } else {
          this.setState({
            error: false,
            texto: { error: <p>{data.message}</p> },
            alert: {
              tipo: "alert-success"
            }
          });
          document.getElementById("formulario-contacto").reset();
        }
      })();
    }
  }

  setCaptcha(value) {
    const mensajes = this.state.texto;
    if (!!this.state.texto.captcha && value.length) {
      delete mensajes.captcha;
    } else {
      mensajes.captcha = "El captcha es obligatorio";
    }
    this.setState(
      Object.assign(this.state, {
        captcha: value,
        texto: mensajes
      })
    );
  }

  render() {
    return (
      <section id='contacto'>
        <div
          className={`alert ${this.state.alert.tipo}`}
          style={{
            display: !!Object.keys(this.state.texto).length ? "block" : "none"
          }}
        >
          {Object.keys(this.state.texto).map(key => this.state.texto[key])}
        </div>
        <div className='container'>
          <div className='row'>
            <div className='col-xs-12 col-md-6'>
              <div className='formulario-contacto'>
                <form onSubmit={this.enviarCorreo} id='formulario-contacto'>
                  {/* Nombre */}
                  <div className='form-group'>
                    <div className='input-group'>
                      <span className='input-group-addon' />
                      <input
                        type='text'
                        className='form-control'
                        id='nombre'
                        aria-describedby='Nombre'
                        placeholder='Nombre'
                        onChange={this.checkField}
                      />
                    </div>
                    {/* /form-group */}
                  </div>
                  {/* /Nombre */}

                  {/* Apellido */}
                  <div className='form-group'>
                    <div className='input-group'>
                      <span className='input-group-addon' />
                      <input
                        type='text'
                        className='form-control'
                        id='apellido'
                        aria-describedby='Apellido'
                        placeholder='Apellido'
                        onChange={this.checkField}
                      />
                    </div>
                    {/* /form-group */}
                  </div>
                  {/* /Apellido */}

                  {/* Email */}
                  <div className='form-group'>
                    <div className='input-group'>
                      <span className='input-group-addon' />
                      <input
                        type='email'
                        className='form-control'
                        id='email'
                        aria-describedby='Email'
                        placeholder='Email'
                        onChange={this.checkField}
                      />
                    </div>
                    {/* /form-group */}
                  </div>
                  {/* /Email */}

                  {/* Telefono */}
                  <div className='form-group'>
                    <div className='input-group'>
                      <span className='input-group-addon' />
                      <input
                        type='tel'
                        className='form-control'
                        id='telefono'
                        aria-describedby='Telefono'
                        placeholder='Telefono'
                        onChange={this.checkField}
                      />
                    </div>
                    {/* /form-group */}
                  </div>
                  {/* /Telefono */}

                  {/* Asunto */}
                  <div className='form-group'>
                    <div className='input-group'>
                      <span className='input-group-addon' />
                      <input
                        type='text'
                        className='form-control'
                        id='asunto'
                        aria-describedby='Asunto'
                        placeholder='Asunto'
                        onChange={this.checkField}
                      />
                    </div>
                    {/* /form-group */}
                  </div>
                  {/* /Asunto */}

                  {/* Mensaje */}
                  <div className='form-group'>
                    <div className='input-group'>
                      <span className='input-group-addon' />
                      <textarea
                        className='form-control'
                        id='mensaje'
                        rows='3'
                        placeholder='Escribe aqui tu consulta...'
                        onChange={this.checkField}
                      />
                    </div>
                    {/* /form-group */}
                  </div>
                  {/* /Mensaje */}

                  <div className='col-xs-12 col-md-6'>
                    <ReCAPTCHA
                      sitekey={this.state.captchaSiteKey}
                      onChange={this.setCaptcha}
                    />
                  </div>

                  {/* Boton Enviar */}
                  <div className='form-group'>
                    <button
                      type='submit'
                      className='btn btn-primary btn-lg btn-block'
                    >
                      Send
                    </button>
                  </div>
                  {/* /form-group */}
                </form>
                {/* /Formulario  */}
              </div>
              {/* /Formulario Contacto */}
            </div>
          </div>
          {/* /row */}
        </div>
        {/* /container */}
      </section>
    );
  }
}

export default Contacto;

Примечание. Ошибки хорошо отображаются в разделе предупреждений.

Я читал несколько SO вопросов, но я не знал, как применить к своему коду, так как мой код работает с React Server.Есть идеи?

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