wie repariert man [Object: null prototype] { Titel: ‘Produkt’ }

Lesezeit: 4 Minuten

Benutzeravatar von Mohamed Aarab
Mohamed Arab

Ich habe angefangen zu lernen node.js mit express Framework , wenn ich ein Formular wie dieses poste:

router.get('/add-product',(req,res,next)=>{
    res.send('<form action="/product" method="POST" ><input type="text" name="title" /><button type="submit">Submit</button></form>');
});
     
router.post('/product',(req,res,next)=>{
    console.log(req.body);
    res.redirect("https://stackoverflow.com/");
});

Wenn ich es tue console.log(req.body) es zeigt an:

[Object: null prototype] { title: 'product' }

statt nur { title: 'product' }

Ich frage mich, ob dies tatsächlich ein Fehler bei express ist oder nur eine Eigenschaft, die kürzlich zu express hinzugefügt wurde, da ich ein anderes Projekt heruntergeladen habe, das letztes Jahr erstellt wurde, und es den gleichen Ansatz verwendet hat, als ich es getan habe console.log(req.body)es zeigte die gleiche Ausgabe.

  • Ändern Sie Ihren URL-codierten Bodyparser auf “true” statt auf “false” und das wird es tun.

    – José Gisber

    13. Januar 2021 um 6:09 Uhr

  • Maximilian Schwarzemüller richtig?

    – Abhay Patil

    11. Februar um 16:13 Uhr

Benutzeravatar von Jonas Wilms
Jonas Wilms

Das ist eigentlich gutes Design. Objekte erben standardmäßig die Object.prototype das einige Hilfsfunktionen enthält (.toString(), .valueOf()). Nun, wenn Sie verwenden req.body und Sie übergeben keine Parameter an die HTTP-Anforderung, dann würden Sie erwarten req.body leer sein. Wenn es nur “ein normales Objekt” wäre, wäre es nicht ganz leer:

console.info(({ "toString": 5 })['toString']);   // 5
console.info(({})['toString']);                  // [Function: toString]

Es gibt eine Möglichkeit, “leere Objekte” zu erstellen, dh Objekte ohne Eigenschaften / Prototypen, und das ist Object.create(null). Sie sehen eines dieser Objekte in der Konsole.

Also nein, dies ist kein Fehler, der behoben werden muss, das ist nur eine großartige Nutzung der Funktionen von JS.

  • Habe dieses Teil hier nicht bekommen: Sie übergeben keine Parameter an die HTTP-Anforderung, dann würden Sie erwarten, dass req.body leer ist. Wenn es nur “ein normales Objekt” wäre, wäre es nicht: req.body.toString();. Können Sie das näher erläutern?

    – Ein Schurken-Otaku

    24. Mai 2019 um 19:32 Uhr

  • @AmitDas meint er auch wenn req.body hätte keine “eigenen” Eigenschaften (zB title wie im obigen Beispiel) würde es immer noch den Standardobjektprototyp erben und Methoden wie haben toString() macht es nicht leer.

    – Akos

    11. März 2020 um 13:54 Uhr

  • Antwort sagt keine Lösung

    – Atul

    22. März um 19:58 Uhr

Versuche dies,

const obj = JSON.parse(JSON.stringify(req.body)); // req.body = [Object: null prototype] { title: 'product' }

console.log(obj); // { title: 'product' }

Viel Spaß beim Programmieren..!

  • Dies ist, was ich am Ende getan habe, um einige Tests zu reparieren, aber es scheint falsch zu sein

    – DCSAN

    17. Juli 2020 um 0:52 Uhr

  • const groups = {…match.groups} // Nullobjekt für Testvergleich entfernen

    – DCSAN

    17. Juli 2020 um 1:06 Uhr

  • Vielen Dank. Dies löst das Problem, aber das Drucken des JSON ist nicht schön.

    – Vengatesh Murugasamy

    20. August 2021 um 18:00 Uhr

  • Danke vielmals. Es ist 1:30 Uhr. Und kämpfen mit sehr grundlegenden Aufgaben, die in Javascript erledigt werden. Sie sagten mir, es ist eine schnelle und schnelle Entwicklung.

    – Atul

    22. März um 20:05 Uhr

Ich habe ein Problem und mein Terminal hat mir die folgende Erklärung gezeigt

body-parser deprecated undefined extended: provide extended option at express

und ich habe das benutzt
app.use(bodyParser.urlencoded({extended: false}))

oder

Wenn Sie eine Express-Version ab Version 4.16 ausführen, geben Sie einfach ein

app.use(express.urlencoded({extended: true}))

Ich denke, es hilft dir

Um mehr über die erweiterte Option zu erfahren, lesen Sie die Dokumentation oder jemand hier hat gut darauf geantwortet – Was bedeutet “erweitert” in Express 4.0?

  • Der Unterschied zwischen „extended:true“ und „extended:false“ besteht in der Verwendung der zugrunde liegenden Parsing-Bibliothek. github.com/expressjs/body-parser#bodyparserurlencodedoptions Es hat nichts mit dem beschriebenen Problem zu tun (das kein Problem ist).

    – zaphod1984

    10. Dezember 2019 um 8:08 Uhr

Sie können verwenden Object.assign um Ihr Problem folgendermaßen zu beheben:

const obj = Object.assign({},req.body)

console.log(obj)

Es initialisiert ein neues Objekt mit Object.prototype und weist alle Eigenschaften von zu req.body dazu.

weil das Objekt auf dem Null-Objekt basiert. Ich fand den besten Weg, dies abzustreifen, z. B. wenn Sie eine genaue Übereinstimmung für Tests benötigen, verwenden Sie:

const groups = {...match.groups} // remove null object for test comparison

Benutzeravatar von Yashwanth MY
Yashwanth MY

Der folgende Code hat bei mir funktioniert

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

Benutzeravatar von Ahmed Jubayer
Ahmed Jubayer

Nur ändern {extended: false} zu {extended: true} es funktioniert für neuere Versionen von Body-Parser. Es funktioniert in der Version ^ 1.19.0

1434390cookie-checkwie repariert man [Object: null prototype] { Titel: ‘Produkt’ }

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy