序列化模型重复值检查

时间:2018-11-21 14:24:53

标签: error-handling orm sqlite sequelize.js

我是续集和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码且被删除= 0的运营商
  2. 如果存在具有相同icao码且被删除= 0的运营商

我通过在validate(针对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 :(得分:0)

看起来我有点累,我错过了退货...

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.");

        }

  })

}

感谢弗洛林避免松弛!