Форма сообщения Axios с Reactjs

Итак, у меня есть этот метод публикации с Axios, и если я отправлю это, он сказал

Uncaught (in promise) Error: Network Error at createError (createError.js:16) at XMLHttpRequest.handleError (xhr.js:87)

Если я использую этот метод:

axios.post('http://localhost:5000/users', ({userid: this.state.userid})

оно работает. Но если я добавлю 2 или более аргумента в сообщение axios, он снова получит ошибку:

axios.post('http://localhost:5000/users', ({userid: this.state.userid}, {fullname: this.state.fullname} ))

Вот мой полный код. Как видите, я пробую разные комбинации кода, и это работает, только если я передаю только 1 аргумент.

import React from 'react';
import axios from 'axios';
// import { Form } from 'antd';
// import { List, Card, Form } from 'antd';

export default class FormUser extends React.Component {
    // constructor(props) {
    //   super(props)
    //   this.state = {
      state = {
        userid: '',
        fullname: '',
        usergroup:'',
        emailid: '',
        mobile: '',
        title: '',

  };

  handleChangeEvent = event => {
    this.setState({ userid: event.target.value });
    this.setState({ fullname: event.target.value });
    this.setState({ usergroup: event.target.value });
    this.setState({ emailid: event.target.value });
    this.setState({ mobile: event.target.value });
    this.setState({ title: event.target.value });
  }

  handleSubmit = event => {
    event.preventDefault();

    // const userform = {userid: this.state.userid};
    // const fullnameForm = {fullname: this.state.fullname};
    // const usergroupForm = {usergroup: this.state.usergroup};
    // const emailidForm = {emailid: this.state.emailid};
    // const mobileForm = {mobile: this.state.mobile};
    // const titleForm = {title: this.state.title};

    axios.post('http://localhost:5000/users', ({userid: this.state.userid}, {fullname: this.state.fullname} )) 
    // { {userid: this.state.userid}, {fullname: this.state.fullname} , usergroup: this.state.usergroup, emailid: this.state.emailid, mobile: this.state.mobile, title: this.state.title }) 
    // { userform, fullnameForm, usergroupForm, emailidForm, mobileForm, titleForm }) 
      .then(res => {
        console.info(res);
        console.info(res.data);
      })
  }

  render() {
    return (
      <form onSubmit = {this.handleSubmit}>
        <label>User Project ID:  <input type = "text" name = "userid" onChange = {this.handleChangeEvent}/></label><br/>
        <label>Full Name:  <input type = "text" name = "fullname" onChange = {this.handleChangeEvent}/></label><br/>
        <label>User Group:  <input type = "text" name = "usergroup" onChange = {this.handleChangeEvent}/></label><br/>
        <label>Email:  <input type = "text" name = "emailid" onChange = {this.handleChangeEvent}/></label><br/>
        <label>Mobile:  <input type = "text" name = "mobile" onChange = {this.handleChangeEvent}/></label><br/>
        <label>Title:  <input type = "text" name = "title" onChange = {this.handleChangeEvent}/></label>
        <button type = "submit">Add</button>
      </form>
    )
  }
}

AXIOS POST в экспрессе

app.post('/users', function (req, res) {
  var postData = req.body;
  // postData.created_at = new Date();
  connection.query("INSERT INTO users SET ?", postData, function (error, results, fields) {
    if (error) throw error;
    console.info(results.insertId);
    res.end(JSON.stringify(results));
  });
});

Не имеет отношения к фактическому вопросу, но с таким обработчиком handleChangeEvent все ваши поля состояния в конечном итоге будут иметь одинаковое значение. Кроме того, поскольку <input> не имеют опоры value, они неконтролируемы, что, вероятно, не то, что вам нужно.

AKX 31.05.2018 08:33

Должен ли я перейти на это? <input type = "text" name = "this.state.userid" onChange = {this.handleChangeEvent} />

Eko Andri 31.05.2018 08:39

Я предлагаю (повторно) прочитать документацию React о формах. reactjs.org/docs/forms.html

AKX 31.05.2018 08:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
3
18 904
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Третий аргумент axios.post(url[, data[, config]]) - это объект конфигурации Axios, который вы случайно передаете в

axios.post('http://localhost:5000/users', ({userid: this.state.userid}, {fullname: this.state.fullname} ))

поэтому запрос неправильно настроен и не работает.

Вместо этого все данные для POST должны быть в одном объекте data.

axios.post('http://localhost:5000/users', {
  userid: this.state.userid,
  fullname: this.state.fullname,
})

Так есть ли что-то для прослушивания POST в локальный: 5000? Ваше приложение React также находится на локальный: 5000? Если они принадлежат к разным источникам, вам необходимо настроить CORS, чтобы приложение React могло взаимодействовать с серверной частью.

AKX 31.05.2018 08:44

Да, у меня есть настройка и работа cors. Экспресс - 8000. Как я уже говорил ранее, данные одного сообщения работают, но не работают, если есть два или более данных. Как я могу изменить состояние на массив объекта? Это возможно?

Eko Andri 31.05.2018 08:49

Посмотрите на вкладку «Сеть» в консоли браузера, чтобы узнать, какова фактическая отправляемая полезная нагрузка и какова фактическая сетевая ошибка. Это может быть 400 или 500 из вашего приложения.

AKX 31.05.2018 09:09

Если я отправляю 2 данных, он говорит Access-Control-Request-Headers: тип содержимого, а под ним Access-Control-Method: POST. Если опубликовать отдельные данные, появится консольный журнал с данными.

Eko Andri 31.05.2018 09:22

Я только что заметил, что отдельные данные фактически были записаны в базу данных, остальные поля пусты.

Eko Andri 31.05.2018 09:31

Ваш сервер Express настроен на прием данных JSON?

AKX 31.05.2018 09:32

Вот быстрый пример Codesandbox с использованием удаленного сервера с поддержкой CORS, и он действительно работает, хотя, как вы можете видеть в инспекторе, полезная нагрузка отправляется как один объект JSON, как это принято по умолчанию для Axios. codeandbox.io/s/94xq657qyo

AKX 31.05.2018 09:33

Я уже добавил раздел поста, который получает данные json. И я использую Postman, и он работает, и данные из Postman успешно добавлены в базу данных.

Eko Andri 31.05.2018 09:34

Значит, с данными что-то не так. Используйте вкладку сети, чтобы проверить отправляемый запрос ... i.imgur.com/PB2RoqO.png

AKX 31.05.2018 09:37

Поэтому я использую этот код: axios.post ('localhost: 5000 / пользователей', {userid: this.state.userid, fullname: this.state.fullname, usergroup: this.state.usergroup, emailid: this.state.emailid, mobile: this .state.mobile, title: this.state.title},) и измените name = "userid" на этот код: <input type = "text" name = "this.state.userid" onChange = {this.handleChangeEvent} , и все соответствующие данные, и он работает, без ошибок, но все данные в базе данных имеют одно и то же значение, которое является «заголовком».

Eko Andri 31.05.2018 09:44

Очевидно, мне нужно добавить обработчик событий для каждого состояния. Есть ли способ сделать это лучше?

import React from 'react';
import axios from 'axios';
import { Form } from 'antd';
// import { List, Card, Form } from 'antd';

const FormItem = Form.Item;

export default class FormUser extends React.Component {
  // constructor(props) {
  //   super(props)
  //   this.state = {
  state = {
    userid: '',
    fullname: '',
    usergroup: '',
    emailid: '',
    mobile: '',
    title: '',

  };

  handleUserIDChange = event => {this.setState({ userid: event.target.value })}
  handleFullNameChange = event => {this.setState({ fullname: event.target.value })}
  handleUserGroupChange = event => {this.setState({ usergroup: event.target.value })}
  handleEmailIDChange = event => {this.setState({ emailid: event.target.value })}
  handleMobileChange = event => {this.setState({ mobile: event.target.value })}
  handleTitleChange = event => {this.setState({ title: event.target.value })}

  handleSubmit = event => {
    event.preventDefault();

    // const userform = {userid: this.state.userid};
    // const fullnameForm = {fullname: this.state.fullname};
    // const usergroupForm = {usergroup: this.state.usergroup};
    // const emailidForm = {emailid: this.state.emailid};
    // const mobileForm = {mobile: this.state.mobile};
    // const titleForm = {title: this.state.title};

    axios.post('http://localhost:5000/users',
      { userid: this.state.userid, fullname: this.state.fullname, usergroup: this.state.usergroup, emailid: this.state.emailid, mobile: this.state.mobile, title: this.state.title },)
      .then(res => {
        console.info(res);
        console.info(res.data);
      })
  }

  render() {
    return (

      // const formItemLayout = {
      //   labelCol: {
      //     xs: { span: 24 },
      //     sm: { span: 8 },
      //   },
      //   wrapperCol: {
      //     xs: { span: 24 },
      //     sm: { span: 16},
      //   },
      // };

      <Form onSubmit = {this.handleSubmit}>
        <FormItem>
          <label>User Project ID:  <input type = "text" name = "this.state.userid" onChange = {this.handleUserIDChange} /></label>
        </FormItem>
        <FormItem>
          <label>Full Name:  <input type = "text" name = "this.state.fullname" onChange = {this.handleFullNameChange} /></label><br />
        </FormItem>
        <FormItem>
          <label>User Group:  <input type = "text" name = "this.state.usergroup" onChange = {this.handleUserGroupChange} /></label><br />
        </FormItem>
        <FormItem>
          <label>Email:  <input type = "text" name = "this.state.emailid" onChange = {this.handleEmailIDChange} /></label>
        </FormItem>
        <FormItem>
          <label>Mobile:  <input type = "text" name = "this.state.mobile" onChange = {this.handleMobileChange} /></label>
        </FormItem>
        <FormItem>
          <label>Title:  <input type = "text" name = "this.state.title" onChange = {this.handleTitleChange} /></label>
        </FormItem>
        <button type = "submit">Add</button>
      </Form>
    )
  }
}
Ответ принят как подходящий

eventHandler для каждого состояния. Есть ли способ сделать это лучше? да, это будет работать примерно так

import React, { Component } from 'react';

class UserForm extends Component {
  constructor() {
    super();
    this.state = {
      fname: '',
      lname: '',
      email: '',
    };
  }

  onChange = (e) => {
    /*
      Because we named the inputs to match their
      corresponding values in state, it's
      super easy to update the state
    */
    this.setState({ [e.target.name]: e.target.value });
  }

  render() {
    const { fname, lname, email } = this.state;
    return (
      <form>
        <input
          type = "text"
          name = "fname"
          value = {fname}
          onChange = {this.onChange}
        />
        <input
          type = "text"
          name = "lname"
          value = {lname}
          onChange = {this.onChange}
        />
        <input
          type = "text"
          name = "email"
          value = {email}
          onChange = {this.onChange}
        />
      </form>
    );
  }
}

и о представлении формы ваш пост axios будет работать примерно так

onSubmit = (e) => {
    e.preventDefault();
    // get our form data out of state
    const { fname, lname, email } = this.state;

    axios.post('/', { fname, lname, email })
      .then((result) => {
        //access the results here....
      });
  }

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