forked from feathersjs-ecosystem/feathers-mongoose
/
error-handler.js
45 lines (38 loc) · 1.35 KB
/
error-handler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
const errors = require('@feathersjs/errors');
module.exports = function errorHandler (error) {
if (error.code === 11000 || error.code === 11001) {
// NOTE (EK): Error parsing as discussed in this github thread
// https://github.com/Automattic/mongoose/issues/2129
const match1 = error.message.match(/_?([a-zA-Z]*)_?\d?\s*dup key/i);
const match2 = error.message.match(/\s*dup key:\s*\{\s*:\s*"?(\S+)"?\s*\}/i);
const key = match1 ? match1[1] : 'path';
let value = match2 ? match2[1] : 'value';
if (value === 'null') {
value = null;
} else if (value === 'undefined') {
value = undefined;
}
error.message = `${key}: ${value} already exists.`;
error.errors = {
[key]: value
};
return Promise.reject(new errors.Conflict(error));
}
if (error.name) {
switch (error.name) {
case 'ValidationError':
case 'ValidatorError':
case 'CastError':
case 'VersionError':
return Promise.reject(new errors.BadRequest(error));
case 'OverwriteModelError':
return Promise.reject(new errors.Conflict(error));
case 'MissingSchemaError':
case 'DivergentArrayError':
return Promise.reject(new errors.GeneralError(error));
case 'MongoError':
return Promise.reject(new errors.GeneralError(error));
}
}
return Promise.reject(error);
};