【问题标题】:Error handling in node.js data access layernode.js 数据访问层中的错误处理
【发布时间】:2012-07-23 23:44:01
【问题描述】:

假设我正在使用存储库模式进行数据访问,如下所示:

#userController.coffee

# `userId` is obtained from the session

user =
  email: 'Bob'
  password: 'Secret'

db.userRepo(@userId).create user, (err, data) =>
  # return results in http response or socket.io

这是此方法调用期间可能出现的问题:

  • 访问数据库时出错
  • 查询中有语法错误
  • 在可变查询期间打破约束(我使用的是 node-mysql)
  • user 存在验证错误,例如缺少字段等。
  • user.email 的用户已经存在。

我的问题是如何在回调中返回这些错误?

回调参数的选项:

  • (err, data) - 其中err 是遇到的所有错误的数组。
  • (err, data) - 其中err 是验证错误,数据库错误作为异常抛出。
  • (err, data) - 与上述相同,除非 user 已存在,否则返回 null,因为这不是错误,而是预期行为。
  • (err, data, validation) - 其中validation 是一组验证错误或null
  • (err, data, model) - 返回具有验证属性的模型类 - 活动记录样式。

随意提出不同的建议。

后续问题:应该在哪里验证参数?在控制器/路由级别、数据访问级别或 SQL 数据库?

  • 在这两个级别都会有很多重复的代码。我宁愿保持干燥。
  • 使用静态类型,我可以在控制器级别检测错误,并且可以信任类型系统。如果没有静态类型,数据层就无法真正信任任何人,因此它可能需要拥有所有验证逻辑。
  • 通常由静态类型检查发现的错误应该会引发错误,因为我需要修复它们。他们是虫子。但是,如果我没有找到它们,我宁愿给用户一个愉快的消息,而不是内部服务器错误 500 或堆栈跟踪。
  • 如果我想将其演变为公共 API,我肯定需要所有的验证。

我计划使用node-validatorrevalidator 的组合来验证对象和参数。

背景故事:我刚刚从 Scala/Play 转到 Node/Express,因为社区更大、网络套接字支持良好以及开发人员的生产力。在开始使用Sequelize ORM 后,我认为它太受限制,无法创建连接,而且我的模式很简单,所以我开始编写原始 SQL。在开发速度得到初步提升后,我发现自己每天都想要静态输入。我正在编写的测试和验证代码的数量要大得多。

【问题讨论】:

    标签: validation node.js coffeescript typechecking


    【解决方案1】:

    我推荐(err, data, validation),这样您就可以轻松检查用户需要重新输入的无效输入和实际的数据库错误err,这可能会在将详细信息写入日志文件时打印出漂亮的错误消息在测试和原型设计期间。

    【讨论】:

      猜你喜欢
      • 2011-06-19
      • 2012-11-21
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多