Can't post data to Express using React
This is my first time trying to make a full stack app. I already have experience with Django but now i wanted to try using Express.js
So, i made this simple route in express:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var logger = require('morgan');
var User = require('../User/User');
app.use(logger("short"));
app.post("/addUser", (req, res) => {
User.create({
name: req.body.name,
email: req.body.email,
password: req.body.password
}, (err, user) => {
if (err) return res.status(500).json({auth: false})
res.status(200).json(
{
email,
name
}
);
});
});
this is the User schema:
const mongoose = require("mongoose")
const Schema = mongoose.Schema;
const UserSchema = new Schema(
{
name: String,
email: String,
password: String,
},
{timestamps: true}
);
mongoose.model("User", UserSchema);
module.exports = mongoose.model("User");
I already tried doing some post requests using insomnia. They all worked
But when i make a post request using react it creates an object but its name, email, password fields are empty, like this:
createdAt: "2018-11-22T16:59:51.844Z"
updatedAt: "2018-11-22T16:59:51.844Z"
__v: 0
_id: "5bf6e0878bd6663807e57dec"
this is my react code - it's in a func that's called when the form is submitted - (I already added the express server as a proxy):
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
I get code 200 on express' console but the obj doesn't have any data.
Can you help me? - I'm still a beginner to React and Express
Edit: React Component
import React, { Component } from 'react';
import axios from 'axios';
export default class Register extends Component {
constructor(props) {
super(props)
this.state = {
register_name: "",
register_email: "",
register_password: ""
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({[event.target.name]: event.target.value})
}
handleSubmit(event) {
event.preventDefault();
const { register_name, register_email, register_password } = this.state
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
console.log(this.state)
this.clearInputs();
}
render() {
return (
<div>
<form method={"POST"} onSubmit={this.handleSubmit} id={"register-form"}>
<label htmlFor={"register_name"}></label>
<input type={"text"} name={"register_name"} id={"register_name"} placeholder={"name"} value={this.state.register_name} onChange={this.handleChange}></input>
<label htmlFor={"register_email"}>Email</label>
<input type={"email"} name={"register_email"} id={"register_email"} placeholder={"email"} value={this.state.register_email} onChange={this.handleChange}></input>
<label htmlFor={"register_password"} >Password</label>
<input type={"password"} name={"register_password"} id={"register_password"} placeholder={"password"} value={this.state.register_password} onChange={this.handleChange}></input>
<button type={"submit"}>Submit</button>
</form>
</div>
)
}
}
javascript reactjs express axios
add a comment |
This is my first time trying to make a full stack app. I already have experience with Django but now i wanted to try using Express.js
So, i made this simple route in express:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var logger = require('morgan');
var User = require('../User/User');
app.use(logger("short"));
app.post("/addUser", (req, res) => {
User.create({
name: req.body.name,
email: req.body.email,
password: req.body.password
}, (err, user) => {
if (err) return res.status(500).json({auth: false})
res.status(200).json(
{
email,
name
}
);
});
});
this is the User schema:
const mongoose = require("mongoose")
const Schema = mongoose.Schema;
const UserSchema = new Schema(
{
name: String,
email: String,
password: String,
},
{timestamps: true}
);
mongoose.model("User", UserSchema);
module.exports = mongoose.model("User");
I already tried doing some post requests using insomnia. They all worked
But when i make a post request using react it creates an object but its name, email, password fields are empty, like this:
createdAt: "2018-11-22T16:59:51.844Z"
updatedAt: "2018-11-22T16:59:51.844Z"
__v: 0
_id: "5bf6e0878bd6663807e57dec"
this is my react code - it's in a func that's called when the form is submitted - (I already added the express server as a proxy):
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
I get code 200 on express' console but the obj doesn't have any data.
Can you help me? - I'm still a beginner to React and Express
Edit: React Component
import React, { Component } from 'react';
import axios from 'axios';
export default class Register extends Component {
constructor(props) {
super(props)
this.state = {
register_name: "",
register_email: "",
register_password: ""
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({[event.target.name]: event.target.value})
}
handleSubmit(event) {
event.preventDefault();
const { register_name, register_email, register_password } = this.state
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
console.log(this.state)
this.clearInputs();
}
render() {
return (
<div>
<form method={"POST"} onSubmit={this.handleSubmit} id={"register-form"}>
<label htmlFor={"register_name"}></label>
<input type={"text"} name={"register_name"} id={"register_name"} placeholder={"name"} value={this.state.register_name} onChange={this.handleChange}></input>
<label htmlFor={"register_email"}>Email</label>
<input type={"email"} name={"register_email"} id={"register_email"} placeholder={"email"} value={this.state.register_email} onChange={this.handleChange}></input>
<label htmlFor={"register_password"} >Password</label>
<input type={"password"} name={"register_password"} id={"register_password"} placeholder={"password"} value={this.state.register_password} onChange={this.handleChange}></input>
<button type={"submit"}>Submit</button>
</form>
</div>
)
}
}
javascript reactjs express axios
any console entries? maybe a CORS issue?
– luschn
Nov 22 '18 at 17:22
You are taking the info to submit from the state of the componentname: this.state.name
etc, are you sure it is correctly populated ? Show the code of that component.
– Gabriele Petrioli
Nov 22 '18 at 17:22
Just added the code of the component
– Abel Hristodor
Nov 22 '18 at 17:34
add a comment |
This is my first time trying to make a full stack app. I already have experience with Django but now i wanted to try using Express.js
So, i made this simple route in express:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var logger = require('morgan');
var User = require('../User/User');
app.use(logger("short"));
app.post("/addUser", (req, res) => {
User.create({
name: req.body.name,
email: req.body.email,
password: req.body.password
}, (err, user) => {
if (err) return res.status(500).json({auth: false})
res.status(200).json(
{
email,
name
}
);
});
});
this is the User schema:
const mongoose = require("mongoose")
const Schema = mongoose.Schema;
const UserSchema = new Schema(
{
name: String,
email: String,
password: String,
},
{timestamps: true}
);
mongoose.model("User", UserSchema);
module.exports = mongoose.model("User");
I already tried doing some post requests using insomnia. They all worked
But when i make a post request using react it creates an object but its name, email, password fields are empty, like this:
createdAt: "2018-11-22T16:59:51.844Z"
updatedAt: "2018-11-22T16:59:51.844Z"
__v: 0
_id: "5bf6e0878bd6663807e57dec"
this is my react code - it's in a func that's called when the form is submitted - (I already added the express server as a proxy):
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
I get code 200 on express' console but the obj doesn't have any data.
Can you help me? - I'm still a beginner to React and Express
Edit: React Component
import React, { Component } from 'react';
import axios from 'axios';
export default class Register extends Component {
constructor(props) {
super(props)
this.state = {
register_name: "",
register_email: "",
register_password: ""
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({[event.target.name]: event.target.value})
}
handleSubmit(event) {
event.preventDefault();
const { register_name, register_email, register_password } = this.state
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
console.log(this.state)
this.clearInputs();
}
render() {
return (
<div>
<form method={"POST"} onSubmit={this.handleSubmit} id={"register-form"}>
<label htmlFor={"register_name"}></label>
<input type={"text"} name={"register_name"} id={"register_name"} placeholder={"name"} value={this.state.register_name} onChange={this.handleChange}></input>
<label htmlFor={"register_email"}>Email</label>
<input type={"email"} name={"register_email"} id={"register_email"} placeholder={"email"} value={this.state.register_email} onChange={this.handleChange}></input>
<label htmlFor={"register_password"} >Password</label>
<input type={"password"} name={"register_password"} id={"register_password"} placeholder={"password"} value={this.state.register_password} onChange={this.handleChange}></input>
<button type={"submit"}>Submit</button>
</form>
</div>
)
}
}
javascript reactjs express axios
This is my first time trying to make a full stack app. I already have experience with Django but now i wanted to try using Express.js
So, i made this simple route in express:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var logger = require('morgan');
var User = require('../User/User');
app.use(logger("short"));
app.post("/addUser", (req, res) => {
User.create({
name: req.body.name,
email: req.body.email,
password: req.body.password
}, (err, user) => {
if (err) return res.status(500).json({auth: false})
res.status(200).json(
{
email,
name
}
);
});
});
this is the User schema:
const mongoose = require("mongoose")
const Schema = mongoose.Schema;
const UserSchema = new Schema(
{
name: String,
email: String,
password: String,
},
{timestamps: true}
);
mongoose.model("User", UserSchema);
module.exports = mongoose.model("User");
I already tried doing some post requests using insomnia. They all worked
But when i make a post request using react it creates an object but its name, email, password fields are empty, like this:
createdAt: "2018-11-22T16:59:51.844Z"
updatedAt: "2018-11-22T16:59:51.844Z"
__v: 0
_id: "5bf6e0878bd6663807e57dec"
this is my react code - it's in a func that's called when the form is submitted - (I already added the express server as a proxy):
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
I get code 200 on express' console but the obj doesn't have any data.
Can you help me? - I'm still a beginner to React and Express
Edit: React Component
import React, { Component } from 'react';
import axios from 'axios';
export default class Register extends Component {
constructor(props) {
super(props)
this.state = {
register_name: "",
register_email: "",
register_password: ""
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({[event.target.name]: event.target.value})
}
handleSubmit(event) {
event.preventDefault();
const { register_name, register_email, register_password } = this.state
axios.post('/api/auth/addUser', {
name: register_name,
email: register_email,
password: register_password
})
.then(res => res.json())
.catch(err => console.log(err))
console.log(this.state)
this.clearInputs();
}
render() {
return (
<div>
<form method={"POST"} onSubmit={this.handleSubmit} id={"register-form"}>
<label htmlFor={"register_name"}></label>
<input type={"text"} name={"register_name"} id={"register_name"} placeholder={"name"} value={this.state.register_name} onChange={this.handleChange}></input>
<label htmlFor={"register_email"}>Email</label>
<input type={"email"} name={"register_email"} id={"register_email"} placeholder={"email"} value={this.state.register_email} onChange={this.handleChange}></input>
<label htmlFor={"register_password"} >Password</label>
<input type={"password"} name={"register_password"} id={"register_password"} placeholder={"password"} value={this.state.register_password} onChange={this.handleChange}></input>
<button type={"submit"}>Submit</button>
</form>
</div>
)
}
}
javascript reactjs express axios
javascript reactjs express axios
edited Nov 22 '18 at 18:59
Abel Hristodor
asked Nov 22 '18 at 17:16
Abel HristodorAbel Hristodor
125
125
any console entries? maybe a CORS issue?
– luschn
Nov 22 '18 at 17:22
You are taking the info to submit from the state of the componentname: this.state.name
etc, are you sure it is correctly populated ? Show the code of that component.
– Gabriele Petrioli
Nov 22 '18 at 17:22
Just added the code of the component
– Abel Hristodor
Nov 22 '18 at 17:34
add a comment |
any console entries? maybe a CORS issue?
– luschn
Nov 22 '18 at 17:22
You are taking the info to submit from the state of the componentname: this.state.name
etc, are you sure it is correctly populated ? Show the code of that component.
– Gabriele Petrioli
Nov 22 '18 at 17:22
Just added the code of the component
– Abel Hristodor
Nov 22 '18 at 17:34
any console entries? maybe a CORS issue?
– luschn
Nov 22 '18 at 17:22
any console entries? maybe a CORS issue?
– luschn
Nov 22 '18 at 17:22
You are taking the info to submit from the state of the component
name: this.state.name
etc, are you sure it is correctly populated ? Show the code of that component.– Gabriele Petrioli
Nov 22 '18 at 17:22
You are taking the info to submit from the state of the component
name: this.state.name
etc, are you sure it is correctly populated ? Show the code of that component.– Gabriele Petrioli
Nov 22 '18 at 17:22
Just added the code of the component
– Abel Hristodor
Nov 22 '18 at 17:34
Just added the code of the component
– Abel Hristodor
Nov 22 '18 at 17:34
add a comment |
3 Answers
3
active
oldest
votes
There's a series of potential problems here. First, there's no particular need to make a urlencoded form submission here: just use JSON. Your submit could then look something like:
handleSubmit (e) {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/api/auth/adduser', {
email,
name,
password
})
.then(res => /* ... */)
.catch(err => /* ... */)
}
On the server, you're probably after res.json
rather than res.send
.
const { email, name, password } = req.body
// ...
res.status(201).json({
email,
name
})
Also note that you don't need bodyParser
these days (you can just use express.json()
).
Finally, you should use event.target.name
in your handleChange
as the names match the names of your values in component state:
handleChange (e) {
this.setState({ [e.target.name]: event.target.value })
}
Simple example
Client:
const CLEAR_STATE = {
email: '',
name: '',
password: '',
message: ''
}
export default class App extends Component {
state = CLEAR_STATE
handleChange = e => this.setState({
[ e.target.name ]: e.target.value
})
handleSubmit = e => {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/', { email, name, password })
.then(({ data }) => this.setState({
...CLEAR_STATE,
message: `You sent: ${data.email}, ${data.name}, ${data.password}.`
}))
.catch(({ message }) => this.setState({ message }))
}
render () {
return (
<>
<form onSubmit={this.handleSubmit}>
<input
type='text'
name='email'
value={this.state.email}
onChange={this.handleChange} />
<input
type='text'
name='name'
value={this.state.name}
onChange={this.handleChange} />
<input
type='password'
name='password'
value={this.state.password}
onChange={this.handleChange} />
<input type='submit' value='Register' />
</form>
{this.state.message && <p>{this.state.message}</p>}
</>
)
}
}
Server:
app.use(express.json())
app.post('/', (req, res) => {
const { name, email, password } = req.body
res.status(201).json({ name, email, password })
})
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler
– Abel Hristodor
Nov 22 '18 at 18:06
You appear to have skipped addingapp.use(express.json())
in your server-side code. This is why yourreq.body
is undefined.
– Rich Churcher
Nov 22 '18 at 19:02
1
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
add a comment |
You are using the [event.target.id]
of the changed input
element to update the state.
You state
expects name
,email
,password
but receives register_name
,register_email
,register_password
.
You should change the id
of the input
elements to match those in the state or you should use the name
attribute since that is what matches .
this.setState({[event.target.name]: event.target.value});
Keep in mind that the attribute htmlFor
of the label
elements also needs to match the id
and not the name
of the element it is linked to.
Also, you should have noticed that something was wrong since your code will not update the input
elements while you type.
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
@AbelHristodor again you name the post parametersname
,email
,password
in theaxios
call, but in your server route you are usingreq.body.register_name
to access them.
– Gabriele Petrioli
Nov 22 '18 at 18:54
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
@AbelHristodor you needapp.use(express.json());
in your server side script.
– Gabriele Petrioli
Nov 22 '18 at 19:08
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
add a comment |
Everything works out of the box with just bare fetch
.
Here is gist, just make sure you attached bodyParser to express instance
const bodyParser = require('body-parser');
...
app.use(bodyParser.json());
axios lib is useful if you want to upload physical files with FormData
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435712%2fcant-post-data-to-express-using-react%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
There's a series of potential problems here. First, there's no particular need to make a urlencoded form submission here: just use JSON. Your submit could then look something like:
handleSubmit (e) {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/api/auth/adduser', {
email,
name,
password
})
.then(res => /* ... */)
.catch(err => /* ... */)
}
On the server, you're probably after res.json
rather than res.send
.
const { email, name, password } = req.body
// ...
res.status(201).json({
email,
name
})
Also note that you don't need bodyParser
these days (you can just use express.json()
).
Finally, you should use event.target.name
in your handleChange
as the names match the names of your values in component state:
handleChange (e) {
this.setState({ [e.target.name]: event.target.value })
}
Simple example
Client:
const CLEAR_STATE = {
email: '',
name: '',
password: '',
message: ''
}
export default class App extends Component {
state = CLEAR_STATE
handleChange = e => this.setState({
[ e.target.name ]: e.target.value
})
handleSubmit = e => {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/', { email, name, password })
.then(({ data }) => this.setState({
...CLEAR_STATE,
message: `You sent: ${data.email}, ${data.name}, ${data.password}.`
}))
.catch(({ message }) => this.setState({ message }))
}
render () {
return (
<>
<form onSubmit={this.handleSubmit}>
<input
type='text'
name='email'
value={this.state.email}
onChange={this.handleChange} />
<input
type='text'
name='name'
value={this.state.name}
onChange={this.handleChange} />
<input
type='password'
name='password'
value={this.state.password}
onChange={this.handleChange} />
<input type='submit' value='Register' />
</form>
{this.state.message && <p>{this.state.message}</p>}
</>
)
}
}
Server:
app.use(express.json())
app.post('/', (req, res) => {
const { name, email, password } = req.body
res.status(201).json({ name, email, password })
})
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler
– Abel Hristodor
Nov 22 '18 at 18:06
You appear to have skipped addingapp.use(express.json())
in your server-side code. This is why yourreq.body
is undefined.
– Rich Churcher
Nov 22 '18 at 19:02
1
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
add a comment |
There's a series of potential problems here. First, there's no particular need to make a urlencoded form submission here: just use JSON. Your submit could then look something like:
handleSubmit (e) {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/api/auth/adduser', {
email,
name,
password
})
.then(res => /* ... */)
.catch(err => /* ... */)
}
On the server, you're probably after res.json
rather than res.send
.
const { email, name, password } = req.body
// ...
res.status(201).json({
email,
name
})
Also note that you don't need bodyParser
these days (you can just use express.json()
).
Finally, you should use event.target.name
in your handleChange
as the names match the names of your values in component state:
handleChange (e) {
this.setState({ [e.target.name]: event.target.value })
}
Simple example
Client:
const CLEAR_STATE = {
email: '',
name: '',
password: '',
message: ''
}
export default class App extends Component {
state = CLEAR_STATE
handleChange = e => this.setState({
[ e.target.name ]: e.target.value
})
handleSubmit = e => {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/', { email, name, password })
.then(({ data }) => this.setState({
...CLEAR_STATE,
message: `You sent: ${data.email}, ${data.name}, ${data.password}.`
}))
.catch(({ message }) => this.setState({ message }))
}
render () {
return (
<>
<form onSubmit={this.handleSubmit}>
<input
type='text'
name='email'
value={this.state.email}
onChange={this.handleChange} />
<input
type='text'
name='name'
value={this.state.name}
onChange={this.handleChange} />
<input
type='password'
name='password'
value={this.state.password}
onChange={this.handleChange} />
<input type='submit' value='Register' />
</form>
{this.state.message && <p>{this.state.message}</p>}
</>
)
}
}
Server:
app.use(express.json())
app.post('/', (req, res) => {
const { name, email, password } = req.body
res.status(201).json({ name, email, password })
})
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler
– Abel Hristodor
Nov 22 '18 at 18:06
You appear to have skipped addingapp.use(express.json())
in your server-side code. This is why yourreq.body
is undefined.
– Rich Churcher
Nov 22 '18 at 19:02
1
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
add a comment |
There's a series of potential problems here. First, there's no particular need to make a urlencoded form submission here: just use JSON. Your submit could then look something like:
handleSubmit (e) {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/api/auth/adduser', {
email,
name,
password
})
.then(res => /* ... */)
.catch(err => /* ... */)
}
On the server, you're probably after res.json
rather than res.send
.
const { email, name, password } = req.body
// ...
res.status(201).json({
email,
name
})
Also note that you don't need bodyParser
these days (you can just use express.json()
).
Finally, you should use event.target.name
in your handleChange
as the names match the names of your values in component state:
handleChange (e) {
this.setState({ [e.target.name]: event.target.value })
}
Simple example
Client:
const CLEAR_STATE = {
email: '',
name: '',
password: '',
message: ''
}
export default class App extends Component {
state = CLEAR_STATE
handleChange = e => this.setState({
[ e.target.name ]: e.target.value
})
handleSubmit = e => {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/', { email, name, password })
.then(({ data }) => this.setState({
...CLEAR_STATE,
message: `You sent: ${data.email}, ${data.name}, ${data.password}.`
}))
.catch(({ message }) => this.setState({ message }))
}
render () {
return (
<>
<form onSubmit={this.handleSubmit}>
<input
type='text'
name='email'
value={this.state.email}
onChange={this.handleChange} />
<input
type='text'
name='name'
value={this.state.name}
onChange={this.handleChange} />
<input
type='password'
name='password'
value={this.state.password}
onChange={this.handleChange} />
<input type='submit' value='Register' />
</form>
{this.state.message && <p>{this.state.message}</p>}
</>
)
}
}
Server:
app.use(express.json())
app.post('/', (req, res) => {
const { name, email, password } = req.body
res.status(201).json({ name, email, password })
})
There's a series of potential problems here. First, there's no particular need to make a urlencoded form submission here: just use JSON. Your submit could then look something like:
handleSubmit (e) {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/api/auth/adduser', {
email,
name,
password
})
.then(res => /* ... */)
.catch(err => /* ... */)
}
On the server, you're probably after res.json
rather than res.send
.
const { email, name, password } = req.body
// ...
res.status(201).json({
email,
name
})
Also note that you don't need bodyParser
these days (you can just use express.json()
).
Finally, you should use event.target.name
in your handleChange
as the names match the names of your values in component state:
handleChange (e) {
this.setState({ [e.target.name]: event.target.value })
}
Simple example
Client:
const CLEAR_STATE = {
email: '',
name: '',
password: '',
message: ''
}
export default class App extends Component {
state = CLEAR_STATE
handleChange = e => this.setState({
[ e.target.name ]: e.target.value
})
handleSubmit = e => {
e.preventDefault()
const { email, name, password } = this.state
axios.post('/', { email, name, password })
.then(({ data }) => this.setState({
...CLEAR_STATE,
message: `You sent: ${data.email}, ${data.name}, ${data.password}.`
}))
.catch(({ message }) => this.setState({ message }))
}
render () {
return (
<>
<form onSubmit={this.handleSubmit}>
<input
type='text'
name='email'
value={this.state.email}
onChange={this.handleChange} />
<input
type='text'
name='name'
value={this.state.name}
onChange={this.handleChange} />
<input
type='password'
name='password'
value={this.state.password}
onChange={this.handleChange} />
<input type='submit' value='Register' />
</form>
{this.state.message && <p>{this.state.message}</p>}
</>
)
}
}
Server:
app.use(express.json())
app.post('/', (req, res) => {
const { name, email, password } = req.body
res.status(201).json({ name, email, password })
})
edited Nov 22 '18 at 20:01
answered Nov 22 '18 at 17:48
Rich ChurcherRich Churcher
2,60022444
2,60022444
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler
– Abel Hristodor
Nov 22 '18 at 18:06
You appear to have skipped addingapp.use(express.json())
in your server-side code. This is why yourreq.body
is undefined.
– Rich Churcher
Nov 22 '18 at 19:02
1
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
add a comment |
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler
– Abel Hristodor
Nov 22 '18 at 18:06
You appear to have skipped addingapp.use(express.json())
in your server-side code. This is why yourreq.body
is undefined.
– Rich Churcher
Nov 22 '18 at 19:02
1
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
Ok, changed everything but now i get status code 500 -Cannot read property 'register_name' of undefined ( i changed all the names to register_name ecc)
– Abel Hristodor
Nov 22 '18 at 18:05
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler– Abel Hristodor
Nov 22 '18 at 18:06
handleSubmit(event) { event.preventDefault(); const { register_name, register_email, register_password } = this.state axios.post('/api/auth/addUser', { name: register_name, email: register_email, password: register_password }) .then(res => res.json()) .catch(err => console.log(err)) console.log(this.state) this.clearInputs(); }
This is the handler– Abel Hristodor
Nov 22 '18 at 18:06
You appear to have skipped adding
app.use(express.json())
in your server-side code. This is why your req.body
is undefined.– Rich Churcher
Nov 22 '18 at 19:02
You appear to have skipped adding
app.use(express.json())
in your server-side code. This is why your req.body
is undefined.– Rich Churcher
Nov 22 '18 at 19:02
1
1
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
Oh haha thanks :)
– Abel Hristodor
Nov 22 '18 at 19:26
add a comment |
You are using the [event.target.id]
of the changed input
element to update the state.
You state
expects name
,email
,password
but receives register_name
,register_email
,register_password
.
You should change the id
of the input
elements to match those in the state or you should use the name
attribute since that is what matches .
this.setState({[event.target.name]: event.target.value});
Keep in mind that the attribute htmlFor
of the label
elements also needs to match the id
and not the name
of the element it is linked to.
Also, you should have noticed that something was wrong since your code will not update the input
elements while you type.
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
@AbelHristodor again you name the post parametersname
,email
,password
in theaxios
call, but in your server route you are usingreq.body.register_name
to access them.
– Gabriele Petrioli
Nov 22 '18 at 18:54
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
@AbelHristodor you needapp.use(express.json());
in your server side script.
– Gabriele Petrioli
Nov 22 '18 at 19:08
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
add a comment |
You are using the [event.target.id]
of the changed input
element to update the state.
You state
expects name
,email
,password
but receives register_name
,register_email
,register_password
.
You should change the id
of the input
elements to match those in the state or you should use the name
attribute since that is what matches .
this.setState({[event.target.name]: event.target.value});
Keep in mind that the attribute htmlFor
of the label
elements also needs to match the id
and not the name
of the element it is linked to.
Also, you should have noticed that something was wrong since your code will not update the input
elements while you type.
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
@AbelHristodor again you name the post parametersname
,email
,password
in theaxios
call, but in your server route you are usingreq.body.register_name
to access them.
– Gabriele Petrioli
Nov 22 '18 at 18:54
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
@AbelHristodor you needapp.use(express.json());
in your server side script.
– Gabriele Petrioli
Nov 22 '18 at 19:08
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
add a comment |
You are using the [event.target.id]
of the changed input
element to update the state.
You state
expects name
,email
,password
but receives register_name
,register_email
,register_password
.
You should change the id
of the input
elements to match those in the state or you should use the name
attribute since that is what matches .
this.setState({[event.target.name]: event.target.value});
Keep in mind that the attribute htmlFor
of the label
elements also needs to match the id
and not the name
of the element it is linked to.
Also, you should have noticed that something was wrong since your code will not update the input
elements while you type.
You are using the [event.target.id]
of the changed input
element to update the state.
You state
expects name
,email
,password
but receives register_name
,register_email
,register_password
.
You should change the id
of the input
elements to match those in the state or you should use the name
attribute since that is what matches .
this.setState({[event.target.name]: event.target.value});
Keep in mind that the attribute htmlFor
of the label
elements also needs to match the id
and not the name
of the element it is linked to.
Also, you should have noticed that something was wrong since your code will not update the input
elements while you type.
answered Nov 22 '18 at 17:40
Gabriele PetrioliGabriele Petrioli
150k23199256
150k23199256
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
@AbelHristodor again you name the post parametersname
,email
,password
in theaxios
call, but in your server route you are usingreq.body.register_name
to access them.
– Gabriele Petrioli
Nov 22 '18 at 18:54
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
@AbelHristodor you needapp.use(express.json());
in your server side script.
– Gabriele Petrioli
Nov 22 '18 at 19:08
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
add a comment |
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
@AbelHristodor again you name the post parametersname
,email
,password
in theaxios
call, but in your server route you are usingreq.body.register_name
to access them.
– Gabriele Petrioli
Nov 22 '18 at 18:54
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
@AbelHristodor you needapp.use(express.json());
in your server side script.
– Gabriele Petrioli
Nov 22 '18 at 19:08
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
oh yeah, forgot i changed them haha. Anyway, changed everything, same result
– Abel Hristodor
Nov 22 '18 at 17:49
@AbelHristodor again you name the post parameters
name
, email
,password
in the axios
call, but in your server route you are using req.body.register_name
to access them.– Gabriele Petrioli
Nov 22 '18 at 18:54
@AbelHristodor again you name the post parameters
name
, email
,password
in the axios
call, but in your server route you are using req.body.register_name
to access them.– Gabriele Petrioli
Nov 22 '18 at 18:54
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
okk, but now i get ` Cannot read property 'name' of undefined```
– Abel Hristodor
Nov 22 '18 at 18:59
@AbelHristodor you need
app.use(express.json());
in your server side script.– Gabriele Petrioli
Nov 22 '18 at 19:08
@AbelHristodor you need
app.use(express.json());
in your server side script.– Gabriele Petrioli
Nov 22 '18 at 19:08
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
Okk thanks :) I've been trying to solve this problem for a few days and it got very frustrating haha
– Abel Hristodor
Nov 22 '18 at 19:25
add a comment |
Everything works out of the box with just bare fetch
.
Here is gist, just make sure you attached bodyParser to express instance
const bodyParser = require('body-parser');
...
app.use(bodyParser.json());
axios lib is useful if you want to upload physical files with FormData
add a comment |
Everything works out of the box with just bare fetch
.
Here is gist, just make sure you attached bodyParser to express instance
const bodyParser = require('body-parser');
...
app.use(bodyParser.json());
axios lib is useful if you want to upload physical files with FormData
add a comment |
Everything works out of the box with just bare fetch
.
Here is gist, just make sure you attached bodyParser to express instance
const bodyParser = require('body-parser');
...
app.use(bodyParser.json());
axios lib is useful if you want to upload physical files with FormData
Everything works out of the box with just bare fetch
.
Here is gist, just make sure you attached bodyParser to express instance
const bodyParser = require('body-parser');
...
app.use(bodyParser.json());
axios lib is useful if you want to upload physical files with FormData
answered Nov 22 '18 at 20:05
bFuncbFunc
679712
679712
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53435712%2fcant-post-data-to-express-using-react%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
any console entries? maybe a CORS issue?
– luschn
Nov 22 '18 at 17:22
You are taking the info to submit from the state of the component
name: this.state.name
etc, are you sure it is correctly populated ? Show the code of that component.– Gabriele Petrioli
Nov 22 '18 at 17:22
Just added the code of the component
– Abel Hristodor
Nov 22 '18 at 17:34