【问题标题】:Database query API error construction数据库查询API报错构建
【发布时间】:2018-10-15 11:51:52
【问题描述】:

我正在开发一个简单的 API,该 API 使用从表单客户端提供的信息执行对 SQL 数据库的 INSERT 查询,这些信息将在前端填写。我很好奇在构建有关查询错误的错误消息时是否有首选方法。

使用一个具体的例子,我有一个表格要由具有属性 A、B 和 C 的用户填写。在 SQL 数据库中,它们都强制执行“非空”约束。因此,如果提交的是空表单,则会返回以下错误对象:

{
...
errors:
  [ ValidateErrorItem {
      message: "model.a cannot be null"
      type: "..."
      path: "..." 
      value: "..."
      .. },
    ValidateErrorItem {
      message: "model.b cannot be null"
      type: "..."
      path: "..." 
      value: "..."
      .. },
    ValidateErrorItem {
      message: "model.c cannot be null"
      type: "..."
      path: "..." 
      value: "..."
      .. },
  ]
}

通常如何构造一条错误消息以显示给用户(而不是简单地显示“查询发生错误”)?

注意:我知道可以使用前端验证来防止这种情况,但其他事情可能会出错(除了非空验证),所以这只是一个发生错误时的简单示例,不一定是我想要的在实践中做。

【问题讨论】:

    标签: node.js postgresql api error-handling sequelize.js


    【解决方案1】:

    应该为每个 api 请求执行这些类型的验证。我更喜欢使用Joi

    只要架构与您的期望不匹配,Joi 就会抛出错误。例如

    const schema = Joi.object().keys({
      modelA: Joi.string().required(),
      modelB: Joi.string().required(),
      modelC: Joi.string().required(),
    });
    
    const myObj = { modelA: 'modelA' };
    console.log(Joi.validate(myObj, schema));
    

    以上代码会抛出错误{ ValidationError: child "modelB" fails because ["modelB" is required]

    您也可以像这样添加客户错误消息

    const schema = Joi.object().keys({
      modelA: Joi.string().required(),
      modelB: Joi.string().required().error(new Error('Was expecting a string')),
      modelC: Joi.string().required(),
    });
    const myObj = { modelA: 'modelA' };
    console.log(Joi.validate(myObj, schema));
    

    这会报错

       Error: Was expecting a string
    

    这些消息可以被前端解析并显示出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2013-05-24
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多