Я новичок в секвелизе и ORM, и я пытаюсь создать модель.Вот что у меня есть:
/* Carrier model definition */
const carrier = sequelize.define('carrier', {
/* The unique carrier id */
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
/* The iata code of the carrier */
iata: {
type: Sequelize.STRING,
validate: {
is: {
args: ["^[A-Z]{1}[0-9]{1}$|^[A-Z]{1}[A-Z]{1}$|^[0-9]{1}[A-Z]{1}$|^\s*$"],
msg: "Carrier iata code is invalid."
}
}
},
/* The icao code of the carrier */
icao: {
type: Sequelize.STRING,
validate: {
is: {
args: ["^[A-Z]{3}$|^\s*$"],
msg: "Carrier icao code is invalid."
}
}
},
/* The deleted flag of the carrier */
isdeleted: {
type: Sequelize.INTEGER,
validate: {
isIn: {
args: [
[0, 1]
],
msg: "Carrier \"is deleted value\" can be 0 or 1."
}
}
}
}, {
/* Perform model validations */
validate: {
carrierValidator() {
/* Ensure that at least an iata or an icao code exists */
if ((this.iata == "") && (this.icao == "")) {
throw new Error('Carrier must have at least an iata code or an icao code or both.');
}
}
},
/* Apply hooks */
hooks: {
beforeValidate: (carrier, options) => {
/* Capitalize carrier iata code */
carrier.iata = (typeof carrier.iata === 'undefined') ? "" : carrier.iata.toUpperCase();
/* Capitalize carrier icao code */
carrier.icao = (typeof carrier.icao === 'undefined') ? "" : carrier.icao.toUpperCase();
/* Set default isdeleted value to 0 */
carrier.isdeleted = (typeof carrier.isdeleted === 'undefined') ? 0 : parseInt(carrier.isdeleted);
}
}
})
Свойство isdeleted - это столбец, который определяет, удалена запись или нет.Если он удален, его значение равно 1, а если нет 0.
Теперь я хочу запретить вставку нового носителя, если выполняется одно из следующих условий:
- Еслисуществует оператор с таким же кодом iata и isdeleted = 0
- Если существует оператор с таким же кодом icao и isdeleted = 0
Мне удалось добиться этого, добавивследующий блок внутри проверки (для случая iata):
if (this.iata != ""){
sequelize.models.carrier.findAndCountAll({
where: {
iata: this.iata,
isdeleted:0
}
}).then((result) => {
if (result.rows != 0){
throw new Error("Carrier iata code already exists.");
}
})
}
, и когда я пытаюсь вставить дубликат, я получаю очень уродливый ответ:
Есть ли способ получить экземпляр ValidationError , чтобы обработать его и отобразить более легко?