Итак, у меня есть этот метод публикации с 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));
});
});
Должен ли я перейти на это? <input type = "text" name = "this.state.userid" onChange = {this.handleChangeEvent} />
Я предлагаю (повторно) прочитать документацию React о формах. reactjs.org/docs/forms.html



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Третий аргумент 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 могло взаимодействовать с серверной частью.
Да, у меня есть настройка и работа cors. Экспресс - 8000. Как я уже говорил ранее, данные одного сообщения работают, но не работают, если есть два или более данных. Как я могу изменить состояние на массив объекта? Это возможно?
Посмотрите на вкладку «Сеть» в консоли браузера, чтобы узнать, какова фактическая отправляемая полезная нагрузка и какова фактическая сетевая ошибка. Это может быть 400 или 500 из вашего приложения.
Если я отправляю 2 данных, он говорит Access-Control-Request-Headers: тип содержимого, а под ним Access-Control-Method: POST. Если опубликовать отдельные данные, появится консольный журнал с данными.
Я только что заметил, что отдельные данные фактически были записаны в базу данных, остальные поля пусты.
Ваш сервер Express настроен на прием данных JSON?
Вот быстрый пример Codesandbox с использованием удаленного сервера с поддержкой CORS, и он действительно работает, хотя, как вы можете видеть в инспекторе, полезная нагрузка отправляется как один объект JSON, как это принято по умолчанию для Axios. codeandbox.io/s/94xq657qyo
Я уже добавил раздел поста, который получает данные json. И я использую Postman, и он работает, и данные из Postman успешно добавлены в базу данных.
Значит, с данными что-то не так. Используйте вкладку сети, чтобы проверить отправляемый запрос ... i.imgur.com/PB2RoqO.png
Поэтому я использую этот код: 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} , и все соответствующие данные, и он работает, без ошибок, но все данные в базе данных имеют одно и то же значение, которое является «заголовком».
Очевидно, мне нужно добавить обработчик событий для каждого состояния. Есть ли способ сделать это лучше?
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....
});
}
Не имеет отношения к фактическому вопросу, но с таким обработчиком
handleChangeEventвсе ваши поля состояния в конечном итоге будут иметь одинаковое значение. Кроме того, поскольку <input> не имеют опорыvalue, они неконтролируемы, что, вероятно, не то, что вам нужно.