Skip to content

Commit

Permalink
feat(error): use util.inspect() so CastError never prints "[object Ob…
Browse files Browse the repository at this point in the history
…ject]"

Fix #4398
  • Loading branch information
vkarpov15 committed Aug 16, 2016
1 parent 9b254ed commit f35cbde
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 3 deletions.
9 changes: 8 additions & 1 deletion lib/error/cast.js
Expand Up @@ -3,6 +3,7 @@
*/

var MongooseError = require('../error.js');
var util = require('util');

/**
* Casting Error constructor.
Expand All @@ -14,7 +15,13 @@ var MongooseError = require('../error.js');
*/

function CastError(type, value, path, reason) {
MongooseError.call(this, 'Cast to ' + type + ' failed for value "' + value + '" at path "' + path + '"');
var stringValue = util.inspect(value);
stringValue = stringValue.replace(/^'/, '"').replace(/'$/, '"');
if (stringValue.charAt(0) !== '"') {
stringValue = '"' + stringValue + '"';
}
MongooseError.call(this, 'Cast to ' + type + ' failed for value ' +
stringValue + ' at path "' + path + '"');
if (Error.captureStackTrace) {
Error.captureStackTrace(this);
} else {
Expand Down
2 changes: 1 addition & 1 deletion test/model.querying.test.js
Expand Up @@ -961,7 +961,7 @@ describe('model: querying:', function() {
assert.equal(nes1.length, 1);

NE.find({b: {$ne: [1]}}, function(err) {
assert.equal(err.message, 'Cast to ObjectId failed for value "1" at path "b"');
assert.equal(err.message, 'Cast to ObjectId failed for value "[ 1 ]" at path "b"');

NE.find({b: {$ne: 4}}, function(err) {
assert.equal(err.message, 'Cast to ObjectId failed for value "4" at path "b"');
Expand Down
2 changes: 1 addition & 1 deletion test/types.buffer.test.js
Expand Up @@ -72,7 +72,7 @@ describe('types.buffer', function() {
assert.equal(err.name, 'ValidationError');
assert.equal(err.errors.required.name, 'CastError');
assert.equal(err.errors.required.kind, 'Buffer');
assert.equal(err.errors.required.message, 'Cast to Buffer failed for value "[object Object]" at path "required"');
assert.equal(err.errors.required.message, 'Cast to Buffer failed for value "{ x: [ 20 ] }" at path "required"');
assert.deepEqual(err.errors.required.value, {x: [20]});
t.required = new Buffer('hello');

Expand Down

0 comments on commit f35cbde

Please sign in to comment.