req.body vuoto sui post


256

All'improvviso è successo a tutti i miei progetti.

Ogni volta che scrivo un post in nodejs usando express e body-parser req.bodyè un oggetto vuoto.

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded())

// parse application/json
app.use(bodyParser.json())

app.listen(2000);

app.post("/", function (req, res) {
  console.log(req.body) // populated!
  res.send(200, req.body);
});

Via Ajax e postino è sempre vuoto.

Tuttavia via ricciolo

$ curl -H "Content-Type: application/json" -d '{"username":"xyz","password":"xyz"}' http://localhost:2000/

funziona come previsto.

Ho provato a impostare manualmente Content-type : application/jsonnel primo ma poi ottengo sempre400 bad request

Questo mi sta facendo impazzire.

Ho pensato che fosse qualcosa di aggiornato in body-parser ma ho declassato e non ha aiutato.

Qualsiasi aiuto apprezzato, grazie.


16
Quindi hai provato a impostare esplicitamente il Content-Typepostino? In caso contrario, potresti provarlo, dato che ho già avuto problemi con Postman che non ha inviato a Content-Type.
— mscdex,

si l'ho fatto. questo è quando ho ricevuto 400: json non valido
— Joseph Dailey,

@mscdex - grazie non ho impostato content-tupe in postino e stavo diventando pazzo :)
— Muzafar Ali

Per quelle persone che vengono qui perché desiderano inviare / caricare file dalle loro API e quindi devono utilizzare i dati del modulo. Hai bisogno di qualcosa per gestire i dati del modulo: npmjs.com/package/multer è un pacchetto piuttosto popolare.
— bhaskar,

Indipendentemente da ciò, il postino non tratta molto bene i valori interi e float. Se hai valori interi o float, assicurati di
— racchiudere tra

Risposte:


272

In Postman delle 3 opzioni disponibili per il tipo di contenuto selezionare "X-www-form-urlencoded" e dovrebbe funzionare.

Inoltre per eliminare il messaggio di errore sostituire:

app.use(bodyParser.urlencoded())

Con:

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

Vedi https://github.com/expressjs/body-parser

Il middleware "body-parser" gestisce solo dati JSON e codificati in url, non multipart


Ha funzionato per il postino, non sono sicuro del perché funzioni con Ajax perché non ho cambiato nulla.
— Joseph Dailey,

Per qualche motivo, i post http tramite Angular non dovevano essere codificati in URL, ma le chiamate ajax sì. Qualcuno sa perché?
— youngrrrr

Questo ha funzionato per me, perché non ha funzionato con il raw codificato?
— Daniel Kobe,

9
ora body-parser è integrato con express.js basta usareapp.use(express.json());
— Sujeet Agrahari,

Grazie mille! Nonostante il lungo periodo di risposta, è ancora pertinente.
— Spray'n'Pray
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.