如何在 Express 中显示 Sequelize 验证错误消息 API

How to display Sequelize validation error messages in Express API

我在节点中使用了这个组织模型。js/Express API 和 Sequelize ORM 运行 MySQL。当我在下面的第一个代码示例中违反 validation 下的 2-100 个字符规则时,我从第二个代码示例中的 catch 块中获得了经典的 err 项,其中不包含有关验证错误。

我想改为显示验证错误消息,您可以在模型的 validation { len: { msg: ...}} 下看到。至少 console.log 它,然后再显示给最终用户。

但是,Sequelize 手册和我能找到的任何其他信息都没有解释我如何使用此自定义错误消息。所以我的问题是如何使用它并显示它。

型号:

'use strict'

const { Sequelize, DataTypes } = require('sequelize');
const db = require('./../config/db.js')

const Organization = db.define('organizations', {
  id: {
    type: DataTypes.UUID,
    defaultValue: Sequelize.UUIDV4,
    primaryKey: true,
    allowNull: false,
    unique: true,
    validate: {
      isUUID: {
        args: 4,
        msg: 'The ID must be a UUID4 string'
      }
    }
  },
  name: {
    type: DataTypes.STRING,
    required: true,
    allowNull: false,
    validate: {
      len: {
        args: [2, 100],
        msg: 'The name must contain between 2 and 100 characters.' // Error message I want to display
      }
    }
  },
  created_at: {
    type: DataTypes.DATE,
    required: true,
    allowNull: false
  },
  updated_at: {
    type: DataTypes.DATE,
    required: true,
    allowNull: false
  },
  deleted_at: {
    type: DataTypes.DATE
  }
},
{
  underscored: true,
  paranoid: true,
  tableName: 'organizations',
  updatedAt: 'updated_at',
  createdAt: 'created_at',
  deletedAt: 'deleted_at'
})

module.exports = Organization

控制器:

/**
 *  @description Create new organization
 *  @route POST /api/v1/organizations
 */

exports.createOrganization = async (req, res, next) => {
  try {
    const org = await Organization.create(
      req.body,
      {
        fields: ['name', 'type']
      })
    return res.status(200).json({
      success: true,
      data: {
        id: org.id,
        name: org.name
      },
      msg: `${org.name} has been successfully created.`
    })
  } catch (err) {
    next(new ErrorResponse(`Sorry, could not save the new organization`, 404))

// ^ This is the message I get if I violate the validation rule ^

  }
}

用于验证和约束的 Sequelize 文档可在此处找到:https://sequelize.org/master/manual/validations-and-constraints.html

验证是基于 Validatorjs (https://github.com/validatorjs/validator.js) 构建的,不幸的是,它也缺少有关使用验证对象的实用信息。我想这意味着它必须是不言自明的,但由于我是菜鸟,所以我迷路了。

我在 firstName 字段上对我的本地项目尝试了相同的验证,我可能会遇到这样的续集错误

console.log('err.name', err.name);
console.log('err.message', err.message);
console.log('err.errors', err.errors);
err.errors.map(e => console.log(e.message)) // The name must contain between 2 and 100 characters.

如您所见,您可以检查 err.name 是否为 SequelizeValidationError,然后遍历 err.errors 数组并为 path 上的字段获取 message 和其余的其他属性也在那里。

错误显示示例:

const errObj = {};
err.errors.map( er => {
   errObj[er.path] = er.message;
})
console.log(errObj);

你会得到一个像

这样的对象
{ 
  firstName: 'The firstName must contain between 2 and 100 characters.',
  lastName: 'The lastName must contain between 2 and 100 characters.' 
}

在得到@Rohit Ambre 的帮助后,我的捕获块是这样的:

} catch (err) {
    if (err.name === 'SequelizeValidationError') {
      return res.status(400).json({
        success: false,
        msg: err.errors.map(e => e.message)
      })
    } else {
      next(new ErrorResponse(`Sorry, could not save ${req.body.name}`, 404))
    }
  }

API 回复:

{
    "success": false,
    "msg": [
        "The name must contain between 2 and 100 characters.",
        "The organization type is not valid."
    ]
}

为每个项目添加一个键可能会有所帮助,就像这样,但无论我在 catch 块中做什么,它似乎都会给我一个 UnhandledPromiseRejectionWarning:

catch (err) {
    if (err.name === 'SequelizeValidationError') {
       const errors = err.errors

      const errorList = errors.map(e => {
        let obj = {}
        obj[e] = e.message
        return obj;
      })
      
      return res.status(400).json({
        success: false,
        msg: errorList
      })
    } else {
      next(new ErrorResponse(`Sorry, could not save ${req.body.name}`, 404))
    }
  }

有什么建议吗?

你可以在迁移中执行一个简单的标志 --debug npx sequelize-cli db:migrate --debug