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.
node-database-error/src/errors/unique-constraint-violation.js

59 lines
1.8 KiB
JavaScript

'use strict';
const { create } = require("error-chain");
const pgErrorCodes = require("pg-error-codes");
const DatabaseError = require("../database-error.js");
const splitValues = require("../split-values");
let UniqueConstraintViolationError = create("UniqueConstraintViolationError", { inheritsFrom: DatabaseError });
let detailsRegex = /Key \(([^\)]+)\)=\(([^\)]+)\) already exists\./;
module.exports = {
error: UniqueConstraintViolationError,
errorName: "UniqueConstraintViolationError",
check: function checkType(error) {
return (
// PostgreSQL (via `pg`):
(error.length != null && error.file != null && error.line != null && error.routine != null && error.code === "23505")
);
},
convert: function convertError(error) {
let [_, columnValue, valueValue] = detailsRegex.exec(error.detail);
let column, columns, value, values, messageColumn, messageValue, isComposite;
if (columnValue.includes(",")) {
columns = splitValues(columnValue);
messageColumn = `columns [${columns.map(column => `'${column}'`).join(", ")}]`;
isComposite = true;
} else {
column = columnValue;
messageColumn = `column '${column}'`;
isComposite = false;
}
if (valueValue.includes(",")) {
values = splitValues(valueValue);
messageValue = `Values [${values.map(value => `'${value}'`).join(", ")}] already exist`;
} else {
value = valueValue;
messageValue = `Value '${value}' already exists`;
}
return new UniqueConstraintViolationError(`${messageValue} for ${messageColumn} in table '${error.table}'`, {
originalError: error,
pgCode: error.code,
code: pgErrorCodes[error.code],
schema: error.schema,
table: error.table,
column: column,
columns: columns,
value: value,
values: values,
isComposite: isComposite,
constraint: error.constraint
});
}
};