You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.3 KiB
JavaScript
55 lines
1.3 KiB
JavaScript
'use strict';
|
|
|
|
const createError = require("create-error");
|
|
const debug = require("debug")("database-error");
|
|
|
|
const DatabaseError = require("./database-error");
|
|
|
|
let UnknownError = createError("UnknownError");
|
|
|
|
let handlers = [
|
|
require("./errors/unique-constraint-violation"),
|
|
require("./errors/check-constraint-violation"),
|
|
require("./errors/foreign-key-constraint-violation"),
|
|
require("./errors/enum"),
|
|
require("./errors/invalid-type"),
|
|
require("./errors/undefined-column"),
|
|
require("./errors/not-null-constraint-violation"),
|
|
]
|
|
|
|
function convertError(error) {
|
|
let handler = handlers.find(handler => handler.check(error));
|
|
|
|
if (handler != null) {
|
|
debug(`Converting error with message: ${error.message}`)
|
|
return handler.convert(error);
|
|
} else {
|
|
throw new UnknownError("The specified error is not of a recognized type");
|
|
}
|
|
}
|
|
|
|
function rethrowBetterError(originalError) {
|
|
try {
|
|
let betterError = convertError(originalError);
|
|
throw betterError;
|
|
} catch (err) {
|
|
if (err instanceof UnknownError) {
|
|
throw originalError;
|
|
} else {
|
|
throw err;
|
|
}
|
|
}
|
|
}
|
|
|
|
let errorTypes = handlers.reduce((errors, handler) => {
|
|
errors[handler.errorName] = handler.error;
|
|
return errors;
|
|
}, {});
|
|
|
|
module.exports = Object.assign({
|
|
convert: convertError,
|
|
rethrow: rethrowBetterError,
|
|
UnknownError: UnknownError,
|
|
DatabaseError: DatabaseError
|
|
}, errorTypes)
|