Sequelize Model Проверка дубликатов - PullRequest
0 голосов
/ 21 ноября 2018

Я новичок в секвелизе и 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.

Теперь я хочу запретить вставку нового носителя, если выполняется одно из следующих условий:

  1. Еслисуществует оператор с таким же кодом iata и isdeleted = 0
  2. Если существует оператор с таким же кодом 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.");

        }

  })

}

, и когда я пытаюсь вставить дубликат, я получаю очень уродливый ответ:

enter image description here

Есть ли способ получить экземпляр ValidationError , чтобы обработать его и отобразить более легко?

1 Ответ

0 голосов
/ 21 ноября 2018

Ну, похоже, я немного устала и пропустила возвращение ...

if (this.iata != ""){

return sequelize.models.carrier.findAndCountAll({
  where: {
    iata: this.iata,
    isdeleted:0
  }
}).then((result) => {

    if (result.rows != 0){

        throw new Error("Carrier iata code already exists.");

        }

  })

}

Спасибо Флорину из Squelize Slack!

...