2013-09-05 9 views
6

enter image description hereOgni oggetto in JS ha un metodo toString()?

enter image description here

Se questo è vero, perché questo errore si verifica? L'oggetto req.body non è null o undefined come mostra l'immagine.

Io uso il node-inspector per eseguire il debug dell'applicazione express.js, questa immagine è stata scattata in Chrome Developer Tools.

espresso configurazione:

app.use(express.bodyParser())

grazie ai vostri commenti, ora ho trovato il req.body è undefined, ma nuova domanda è come fare di nuovo le toString opere? Voglio req.body.toString() per tornare stringa come di seguito:

enter image description here

Come ri-firmare un adeguato metodo di toString?

Ho provato delete il non definito toString, non va bene. Vedere:

enter image description here

+2

Il metodo potrebbe essere stato rimosso. Controlla questo: 'var foo = {}; foo.ToString(); foo.toString = non definito; foo.toString(); '. Esegui questo e guarda cosa succede. – Renan

+0

Puoi espandere la proprietà '__proto__' e caricare un altro screenshot? – Bergi

+1

L'addendum con 'delete' è un po 'una falsa pista. Nel tuo esempio, 'a' non ha mai avuto il suo metodo' toString'; è stato sempre ereditato dal suo prototipo. Pertanto, 'delete' non ha effetto, perché' a' non ha un metodo 'toString' (ad esempio,' a.hasOwnProperty ("toString") è false). – apsillers

risposta

14

fa ogni oggetto in JS hanno un metodo toString()?

No. Solo quelli che ereditano da Object.prototype (come tutti gli oggetti normali fanno) o definirlo da solo (o ereditano dalla loro prototipo personalizzato) fare.

È possibile creare tali oggetti insoliti per Object.create(null). Puoi anche assegnare a un oggetto semplice la proprietà toString che ombreggia quella ereditata e non è una funzione (ad esempio {toString:0}), ma suppongo che avrebbe generato un errore distinto.

Nel tuo caso, sembra che il querystring parser usata da bodyParser() fa (DID) creano, infatti, oggetti senza prototipi, per evitare di pressare .constructor.prototype quando sono stati utilizzati tali parametri. Vedi qs pullrequest #58 e express issue 1636: Bodyparser not setting object.prototype? (suggerendo un aggiornamento).

Come riassegnare un metodo toString corretto?

Si potrebbe semplicemente assegnare qualsiasi funzione, come

req.body.toString = function() { return "Hi, I'm a request body"; }; 

ma probabilmente si desidera quella standard:

req.body.toString = Object.prototype.toString; 

Altre opzioni sarebbero ridefinendo il prototipo attraverso il __proto__ proprietà non standard (req.body.__proto__ = Object.prototype) o semplicemente applicando una funzione standalone sull'oggetto invece di renderlo un metodo, come Object.prototype.toString.call(req.body).

+1

I risultati di 'toString()' possono anche variare a seconda dell'ambiente, quindi anche se è presente, vale la pena tenere presente che il suo output potrebbe non essere affidabile per determinate funzioni. – max

+1

+1, ma si noti che 'req.body' qui sembra avere un prototipo' Object', quindi potrebbero essercene altri nel caso particolare dell'OP. Forse questo oggetto delega il suo 'toString' a un oggetto prototipo non -Object'? – apsillers

+1

@apsillers: Sì, è quello che sospetto anche io. Forse il metodo 'toString' del corpo della richiesta (custom) prova a chiamare' toString() 'su qualche altro oggetto ... – Bergi

Problemi correlati