Je développe une application simple en utilisant Express.js et React, les deux applications dans l'environnement de développement (machine locale) se trouvent sur des ports différents, le serveur (Express) sur localhost: 3001 et Frontend (React) sur localhost: 3000.Express ne reçoit pas les paramètres via POST de React utilisant Fetch API
Le problème que j'ai est que d'essayer d'envoyer des données du Frontend en utilisant Fetch API Express ne reçoit pas les données envoyées via POST par React. J'ai fait un test en faisant un POST à partir d'un formulaire normal et le serveur a accepté les paramètres que j'ai envoyés via POST, donc je pense que le problème est quelque chose avec l'appel de Javascript en utilisant Fetch API.
Dans Express, j'ai déjà installé le module cors pour accepter les demandes qui ne sont pas du même domaine mais le problème persiste. Ci-dessous un extrait de code des deux pour une meilleure compréhension.
...
// handler recieves the 'e' event object
formPreventDefault(e) {
var headers = new Headers();
headers.append('Accept', 'application/json, application/xml, text/plain, text/html, *.*');
headers.append('Content-Type', 'multipart/form-data; charset=utf-8');
headers.append('Access-Control-Allow-Origin', '*');
headers.append('Access-Control-Allow-Headers', 'Content-Type');
var myForm = document.getElementById('myForm');
var formData = new FormData(myForm);
formData.append('email', '[email protected]');
formData.append('password', '12345');
var options = {
headers: headers,
mode: 'no-cors', // crossdomain *
method: 'post',
body: JSON.stringify({ 'email': '[email protected]', 'password': '12345' }) // formData
};
var request = new Request('http://localhost:3001/user/signin', options);
fetch(request).then(function(response) {
console.log("Success");
return response;
}).then(function(json) {
console.log(json);
}).catch(function(err) {
console.log("Error " + err);
})
// prevent submit form
e.preventDefault();
}
render() {
return (
<div className="row">
<div className="col-md-4 ">
<form id="myForm" action="http://localhost:3001/user/signin" method="post" onSubmit={this.formPreventDefault}>
<div className="form-group">
<label htmlFor ="email">Email address</label>
<input type="email" className="form-control" id="email" name="email" placeholder="Email" />
</div>
<div className="form-group">
<label htmlFor ="password">Password</label>
<input type="password" className="form-control" id="password" name="password" placeholder="*******" />
</div>
<button type="submit" className="btn btn-default">Submit</button>
</form>
</div>
</div>
);
}
}
...
express contrôleur
...
// Handle User Sign In on POST
exports.user_create_post = function(req, res) {
console.log(req.body); // This always returns an empty value
//Check that the name field is not empty
req.checkBody('email', 'Email address is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();
//Run the validators
var errors = req.validationErrors();
//Create a genre object with escaped and trimmed data.
var user = new User(
{ email: req.body.email, password: req.body.password }
);
if (errors) {
//If there are errors render the form again, passing the previously entered values and errors
// res.render('users/sign_up', { title: 'Sign Up', user: user, errors: errors });
res.json({ user: user, errors: errors });
return;
}
else {
// Data from form is valid.
//Check if User with same email already exists if not the new user is saved
User.findOne({ 'email': req.body.email })
.exec(function(err, found_user) {
if (err) { return next(err); }
if (found_user) {
//User exists, redirect to the home page
// res.render('users/home', { title: 'Home', user: found_user });
res.json({ user: found_user });
}
else {
// Save user
user.save(function (err) {
if (err) { return next(err); }
// Create session
req.session.user_id = user._id.toString();
// User saved. Display user profile page
// res.render('users/home', { title: 'Home', user: user });
res.json({ user: user });
});
}
});
}
};
...
Toute aide est la bienvenue
Puisque les deux expriment et ne sont pas réagir de la même origine, pour la demande de récupération, vous devez vous assurer '{mode: 'CORS'}' est réglé pour fetch options. Il peut être utile de vérifier si cors fonctionne ou s'il y a du code d'erreur HTTP retourné dans la requête en enregistrant l'objet 'response' ou la valeur response.status dans le premier .then() suivant fetch(). En outre, il peut être utile de vérifier la requête/réponse HTTP de l'API en vérifiant l'onglet réseau de la console développeur sur votre navigateur pour voir s'il y a un problème avec la requête. –
J'ai le "mode: 'no-cors'" dans l'option du fetch.C'est-à-dire que l'objet Response retourne de la requête au serveur Express: Response {type: "opaque", url: "", redirigé: false, status: 0, ok: false, statusText: "", en-têtes: en-têtes, bodyUsed : false} – Wilcho