1
votes

Le corps de la requête est vide lors de la publication des données du formulaire

J'utilise une simple demande de publication dans mon backend pour les données d'un formulaire et pour une raison quelconque, le corps est toujours vide. J'essaie d'isoler cela, donc j'ai changé le type de contenu en application json et changé les données en json et seulement de cette façon, je peux envoyer des données.

Côté client:

// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended:true}));

Du côté serveur:

// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended:true}));

app.use(express.urlencoded());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

app.use(logger('dev'));
app.post('/user-form-post', (req,res) =>{

    console.log("dfdf");
    console.log(req.body); // alwayes print empty dict {}
    res.end();

})

Cela ne fonctionne pas car il attend des jsons (comportement attendu):

submitForm(event) {
        event.preventDefault();
        console.log("gggg");
        const data = new FormData(event.target);

         axios.post("http://localhost:4000/user-form-post",data).then(function (response) {
            //handle success
            console.log(response);
        })
        .catch(function (response) {
            //handle error
            console.log(response);
        });

Même comportement avec Postman.


4 commentaires

pour analyser l'application / x-www-form-urlencoded, n'êtes-vous pas censé utiliser app.use(bodyParser.urlencoded({ extended: false })) ?


J'ai essayé cela aussi. Ca ne fonctionne pas


stackoverflow.com/questions/24543847/req-body-empty-on-posts cela peut vous aider


Déjà regardé ça ... Rien n'y fait


4 Réponses :


2
votes

Vous devrez analyser les données de votre formulaire du côté express. Pour cela, vous devrez utiliser multer ou multipartite. Essayez quelque chose comme ça. consulter également la documentation

const multiparty = require('multiparty');

app.post('/user-form-post', (req,res) =>{

   let form = new multiparty.Form();

   form.parse(req, function(err, fields, files) {
      Object.keys(fields).forEach(function(name) {
           console.log('got field named ' + name);
       });
   });
})


2 commentaires

Pouvez-vous expliquer pourquoi req.body est vide?


@KaramJaber Cela est dû au fait que vous envoyez des données de formulaire depuis le front-end et qu'Express ne peut pas analyser les données de formulaire. Pour cela, vous devrez utiliser une sorte de middlewares capable d'analyser les données de formulaire. Les intergiciels les plus connus sont multer et multiparty.



0
votes

Un problème avec le corps de la demande lorsque vous publiez des données est data type .

J'ai récemment un problème avec Postman . Vous devez publier des données avec le type x-www-form-urlencoded ou raw -> JSON pour résoudre le problème.

Bonne chance.


0 commentaires

1
votes

quand il s'agit de mon problème, j'ai ce frontal

req.body = { form: { email: 'admin@gmail.com', password: '123' } }
axios.post("http://localhost:3000/register", { form })

mais le req.body dans le backend est vide, et j'ai compris que le formulaire dans axios.post avait encore besoin d'un crochet supplémentaire {} même si c'est un objet. comme ça

onSubmit -> form FormData {email: "admin@gmail.com", password: "123"}

Après que le backend ait un corps comme celui-ci

 const form = new FormData();
      form.email = this.email;
      form.password = this.password;
      console.log("onSubmit -> form", form);

axios.post("http://localhost:3000/register",  form )


0 commentaires

0
votes

Vous utilisez:

var multer = require('multer');
var upload = multer();

app.use(express.json()); 

Veuillez également utiliser le code de ligne ci-dessous, mais installez d'abord multer et écrivez le code en haut de votre application:

app.use( bodyParser.json() );  // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
  extended: true
}));


0 commentaires