If that is true, why this error happens? The req.body
object is not null
or undefined
as the picture shows.
I use the node-inspector
to debug my express.js
app, this picture is taken in Chrome Developer Tools
.
Express configuration:
app.use(express.bodyParser())
Thanks to your comments, now I found the req.body
is undefined
, but new question is how to make the toString
works again? I want req.body.toString()
to return string as below:
How to re-sign a proper toString
method?
I tried delete
the undefined toString
, no good. See:
If that is true, why this error happens? The req.body
object is not null
or undefined
as the picture shows.
I use the node-inspector
to debug my express.js
app, this picture is taken in Chrome Developer Tools
.
Express configuration:
app.use(express.bodyParser())
Thanks to your comments, now I found the req.body
is undefined
, but new question is how to make the toString
works again? I want req.body.toString()
to return string as below:
How to re-sign a proper toString
method?
I tried delete
the undefined toString
, no good. See:
1 Answer
Reset to default 19Does every object in JS have a toString() method?
No. Only those that inherit it from Object.prototype
(as all normal objects do) or define it on its own (or inherit it from their custom prototype) do.
You can create such unusual objects by Object.create(null)
. You also could give a plain object an own toString
property that shadows the inherited one and is not a function (e.g. {toString:0}
), but I guess that would've throw a distinct error.
In your case, it seems that the querystring parser used by bodyParser()
does (did) indeed create objects without prototypes, to avoid mangling .constructor.prototype
when such parameters were used. See qs pullrequest #58 and express issue 1636: Bodyparser not setting object.prototype? (suggesting an update).
How to reassign a proper toString method?
You could just assign any function, like
req.body.toString = function() { return "Hi, I'm a request body"; };
but probably you want the standard one:
req.body.toString = Object.prototype.toString;
Other options would be redefining the prototype via the non-standard __proto__
property (req.body.__proto__ = Object.prototype
) or simply applying a standalone function on the object instead of making it a method, like Object.prototype.toString.call(req.body)
.
var foo = {}; foo.ToString(); foo.toString = undefined; foo.toString();
. Run this and see what happens. – Geeky Guy Commented Sep 5, 2013 at 15:51__proto__
property(ies) and upload another screenshot? – Bergi Commented Sep 5, 2013 at 15:55delete
is a bit of a red herring. In your example,a
never had its owntoString
method; it was always inhered from its prototype. Thus, thedelete
has no effect, becausea
doesn't have atoString
method (i.e., `a.hasOwnProperty("toString") is false). – apsillers Commented Sep 5, 2013 at 15:59Object
prototype, but probably lies in a customtoString
directly on the instance itself. Could you also showreq.body.toString
(no parens to invoke it -- I want to see the console rendering of the function's code). – apsillers Commented Sep 5, 2013 at 16:06toString
value is defined directly on your instance,delete
is actually the answer here. Your prototype'stoString
function is "shadowed" by another value on the instance itself. By doingdelete req.body.toString
you blow away theundefined
value and let the prototype'stoString
shine through. You could also doObject.prototype.toString.call(req.body)
if you wanted to invoke it withoutdelete
ing the instancetoString
. – apsillers Commented Sep 5, 2013 at 16:14