【问题标题】:How to validate a field based on another model data如何根据另一个模型数据验证字段
【发布时间】:2019-03-28 06:17:07
【问题描述】:

我正在尝试根据通过另一个模型存储在数据库中的信息来验证日期字段。

当我测试 api 时,验证工作正常并抛出异常,但是,插入发生在此异常之前。也就是说,它不会阻止在数据库中的插入。我哪里出错了?

这是我的验证函数:

module.exports = (sequelize, DataTypes) => {
  const Step = sequelize.define('Step', {
  ...
  resultDate: {
    type: DataTypes.DATE,
    validate: {
      isEven(value){
        sequelize.models.Call
          .findById(this.call_id)
          .then(call => {
            if(value >= call.endingDate) throw new Error('Error message here!');
          });
  ...

结果如下:

Executing (default): SELECT [...] `Call`.`id` = '19c7e81e-5c23-4fd5-8623-0170deee6cd4');
Executing (default): INSERT INTO `Steps` [...];
Unhandled rejection Error message here!

显然,最初的 SELECT 是执行验证,然而,在验证退出并抛出异常之前,API 插入数据库并返回成功!

如何让模型在插入之前等待所有验证?

【问题讨论】:

    标签: mysql node.js validation express sequelize.js


    【解决方案1】:

    通过更改自定义验证器参数(第二个参数是回调),您可以将其更改为异步处理程序。所以你的代码应该是这样的:

    module.exports = (sequelize, DataTypes) => {
      const Step = sequelize.define('Step', {
      ...
      resultDate: {
        type: DataTypes.DATE,
        validate: {
          isEven(value, next){
            sequelize.models.Call
              .findById(this.call_id)
              .then(call => {
                next(value >= call.endingDate ? 'Error message here!' : null)
              })
              .catch(next);
      ...
    

    【讨论】:

    • 有没有办法在“isEven”验证中使用“Step”模型?
    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多