290 lines
8.1 KiB
JavaScript
290 lines
8.1 KiB
JavaScript
'use strict';
|
|
|
|
/**
|
|
* Sequelize provides a host of custom error classes, to allow you to do easier debugging. All of these errors are exposed on the sequelize object and the sequelize constructor.
|
|
* All sequelize errors inherit from the base JS error object.
|
|
*
|
|
* @fileOverview The Error Objects produced by Sequelize.
|
|
* @class Errors
|
|
*/
|
|
|
|
var util = require('util');
|
|
var error = module.exports = {};
|
|
|
|
/**
|
|
* The Base Error all Sequelize Errors inherit from.
|
|
*
|
|
* @constructor
|
|
* @alias Error
|
|
*/
|
|
error.BaseError = function() {
|
|
var tmp = Error.apply(this, arguments);
|
|
tmp.name = this.name = 'SequelizeBaseError';
|
|
|
|
this.message = tmp.message;
|
|
if (Error.captureStackTrace)
|
|
Error.captureStackTrace(this, this.constructor);
|
|
};
|
|
util.inherits(error.BaseError, Error);
|
|
|
|
|
|
/**
|
|
* Validation Error. Thrown when the sequelize validation has failed. The error contains an `errors` property,
|
|
* which is an array with 1 or more ValidationErrorItems, one for each validation that failed.
|
|
*
|
|
* @param {string} message Error message
|
|
* @param {Array} [errors] Array of ValidationErrorItem objects describing the validation errors
|
|
*
|
|
* @extends BaseError
|
|
* @constructor
|
|
*/
|
|
error.ValidationError = function(message, errors) {
|
|
error.BaseError.apply(this, arguments);
|
|
this.name = 'SequelizeValidationError';
|
|
this.message = 'Validation Error';
|
|
/**
|
|
* An array of ValidationErrorItems
|
|
* @member errors
|
|
*/
|
|
this.errors = errors || [];
|
|
|
|
// Use provided error message if available...
|
|
if (message) {
|
|
this.message = message;
|
|
|
|
// ... otherwise create a concatenated message out of existing errors.
|
|
} else if (this.errors.length > 0 && this.errors[0].message) {
|
|
this.message = this.errors.map(function(err) {
|
|
return err.type + ': ' + err.message;
|
|
}).join(',\n');
|
|
}
|
|
};
|
|
util.inherits(error.ValidationError, error.BaseError);
|
|
|
|
/**
|
|
* Gets all validation error items for the path / field specified.
|
|
*
|
|
* @param {string} path The path to be checked for error items
|
|
* @returns {Array} Validation error items for the specified path
|
|
*/
|
|
error.ValidationError.prototype.get = function(path) {
|
|
return this.errors.reduce(function(reduced, error) {
|
|
if (error.path === path) {
|
|
reduced.push(error);
|
|
}
|
|
return reduced;
|
|
}, []);
|
|
};
|
|
|
|
/**
|
|
* A base class for all database related errors.
|
|
* @extends BaseError
|
|
* @constructor
|
|
*/
|
|
error.DatabaseError = function (parent) {
|
|
error.BaseError.apply(this, [parent.message]);
|
|
this.name = 'SequelizeDatabaseError';
|
|
|
|
/**
|
|
* The database specific error which triggered this one
|
|
* @member parent
|
|
*/
|
|
this.parent = parent;
|
|
this.original = parent;
|
|
/**
|
|
* The SQL that triggered the error
|
|
* @member sql
|
|
*/
|
|
this.sql = parent.sql;
|
|
/**
|
|
* The message from the DB.
|
|
* @member message
|
|
* @name message
|
|
*/
|
|
/**
|
|
* The fields of the unique constraint
|
|
* @member fields
|
|
* @name fields
|
|
*/
|
|
/**
|
|
* The value(s) which triggered the error
|
|
* @member value
|
|
* @name value
|
|
*/
|
|
/**
|
|
* The name of the index that triggered the error
|
|
* @member index
|
|
* @name index
|
|
*/
|
|
};
|
|
util.inherits(error.DatabaseError, error.BaseError);
|
|
|
|
/**
|
|
* Thrown when a database query times out because of a deadlock
|
|
* @extends DatabaseError
|
|
* @constructor
|
|
*/
|
|
error.TimeoutError = function (parent) {
|
|
error.DatabaseError.call(this, parent);
|
|
this.name = 'SequelizeTimeoutError';
|
|
};
|
|
util.inherits(error.TimeoutError, error.BaseError);
|
|
|
|
/**
|
|
* Thrown when a unique constraint is violated in the database
|
|
* @extends DatabaseError
|
|
* @constructor
|
|
*/
|
|
error.UniqueConstraintError = function (options) {
|
|
options = options || {};
|
|
options.parent = options.parent || { sql: '' };
|
|
options.message = options.message || options.parent.message || 'Validation Error';
|
|
options.errors = options.errors || {};
|
|
|
|
error.ValidationError.call(this, options.message, options.errors);
|
|
this.name = 'SequelizeUniqueConstraintError';
|
|
this.message = options.message;
|
|
this.errors = options.errors;
|
|
this.fields = options.fields;
|
|
};
|
|
util.inherits(error.UniqueConstraintError, error.ValidationError);
|
|
|
|
/**
|
|
* Thrown when a foreign key constraint is violated in the database
|
|
* @extends DatabaseError
|
|
* @constructor
|
|
*/
|
|
error.ForeignKeyConstraintError = function (options) {
|
|
options = options || {};
|
|
options.parent = options.parent || { sql: '' };
|
|
|
|
error.DatabaseError.call(this, options.parent);
|
|
this.name = 'SequelizeForeignKeyConstraintError';
|
|
|
|
this.message = options.message || options.parent.message || 'Database Error';
|
|
this.fields = options.fields;
|
|
this.table = options.table;
|
|
this.value = options.value;
|
|
this.index = options.index;
|
|
};
|
|
util.inherits(error.ForeignKeyConstraintError, error.DatabaseError);
|
|
|
|
/**
|
|
* Thrown when an exclusion constraint is violated in the database
|
|
* @extends DatabaseError
|
|
* @constructor
|
|
*/
|
|
error.ExclusionConstraintError = function (options) {
|
|
options = options || {};
|
|
options.parent = options.parent || { sql: '' };
|
|
|
|
error.DatabaseError.call(this, options.parent);
|
|
this.name = 'SequelizeExclusionConstraintError';
|
|
|
|
this.message = options.message || options.parent.message;
|
|
this.constraint = options.constraint;
|
|
this.fields = options.fields;
|
|
this.table = options.table;
|
|
};
|
|
util.inherits(error.ExclusionConstraintError, error.DatabaseError);
|
|
|
|
/**
|
|
* Validation Error Item
|
|
* Instances of this class are included in the `ValidationError.errors` property.
|
|
*
|
|
* @param {string} message An error message
|
|
* @param {string} type The type of the validation error
|
|
* @param {string} path The field that triggered the validation error
|
|
* @param {string} value The value that generated the error
|
|
* @constructor
|
|
*/
|
|
error.ValidationErrorItem = function(message, type, path, value) {
|
|
this.message = message || '';
|
|
this.type = type || null;
|
|
this.path = path || null;
|
|
this.value = value || null;
|
|
};
|
|
|
|
/**
|
|
* A base class for all connection related errors.
|
|
* @extends BaseError
|
|
* @constructor
|
|
*/
|
|
error.ConnectionError = function (parent) {
|
|
error.BaseError.apply(this, [parent ? parent.message : '']);
|
|
this.name = 'SequelizeConnectionError';
|
|
/**
|
|
* The connection specific error which triggered this one
|
|
* @member parent
|
|
*/
|
|
this.parent = parent;
|
|
this.original = parent;
|
|
};
|
|
util.inherits(error.ConnectionError, error.BaseError);
|
|
|
|
/**
|
|
* Thrown when a connection to a database is refused
|
|
* @extends ConnectionError
|
|
* @constructor
|
|
*/
|
|
error.ConnectionRefusedError = function (parent) {
|
|
error.ConnectionError.call(this, parent);
|
|
this.name = 'SequelizeConnectionRefusedError';
|
|
};
|
|
util.inherits(error.ConnectionRefusedError, error.ConnectionError);
|
|
|
|
/**
|
|
* Thrown when a connection to a database is refused due to insufficient privileges
|
|
* @extends ConnectionError
|
|
* @constructor
|
|
*/
|
|
error.AccessDeniedError = function (parent) {
|
|
error.ConnectionError.call(this, parent);
|
|
this.name = 'SequelizeAccessDeniedError';
|
|
};
|
|
util.inherits(error.AccessDeniedError, error.ConnectionError);
|
|
|
|
/**
|
|
* Thrown when a connection to a database has a hostname that was not found
|
|
* @extends ConnectionError
|
|
* @constructor
|
|
*/
|
|
error.HostNotFoundError = function (parent) {
|
|
error.ConnectionError.call(this, parent);
|
|
this.name = 'SequelizeHostNotFoundError';
|
|
};
|
|
util.inherits(error.HostNotFoundError, error.ConnectionError);
|
|
|
|
/**
|
|
* Thrown when a connection to a database has a hostname that was not reachable
|
|
* @extends ConnectionError
|
|
* @constructor
|
|
*/
|
|
error.HostNotReachableError = function (parent) {
|
|
error.ConnectionError.call(this, parent);
|
|
this.name = 'SequelizeHostNotReachableError';
|
|
};
|
|
util.inherits(error.HostNotReachableError, error.ConnectionError);
|
|
|
|
/**
|
|
* Thrown when a connection to a database has invalid values for any of the connection parameters
|
|
* @extends ConnectionError
|
|
* @constructor
|
|
*/
|
|
error.InvalidConnectionError = function (parent) {
|
|
error.ConnectionError.call(this, parent);
|
|
this.name = 'SequelizeInvalidConnectionError';
|
|
};
|
|
util.inherits(error.InvalidConnectionError, error.ConnectionError);
|
|
|
|
/**
|
|
* Thrown when a connection to a database times out
|
|
* @extends ConnectionError
|
|
* @constructor
|
|
*/
|
|
error.ConnectionTimedOutError = function (parent) {
|
|
error.ConnectionError.call(this, parent);
|
|
this.name = 'SequelizeConnectionTimedOutError';
|
|
};
|
|
util.inherits(error.ConnectionTimedOutError, error.ConnectionError);
|