node.js数据访问层中的错误处理

时间:2012-07-23 23:44:01

标签: validation node.js coffeescript typechecking

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

#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。在最初的开发速度提升之后,我发现自己每天都想要静态打字。我写的测试和验证代码的数量要大得多。

1 个答案:

答案 0 :(得分:0)

我建议使用(err, data, validation),以便您可以轻松检查用户需要重新输入的无效输入,以及实际数据库错误err,这可能会在编写详细信息时打印出错误消息测试过程中的日志文件原型设计。