在node.js数据访问层中的error handling

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

#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有validation错误,例如缺less字段等
  • 用户已经存在user.email

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

callback参数的选项:

  • (err, data) – 其中err是遇到的所有错误的数组。
  • (err, data) – 其中err是validation错误和数据库错误作为例外抛出。
  • (err, data) – 除了当user已经存在时,它会返回null,因为这不是一个错误,而是期望的行为。
  • (err, data, validation) – 其中validation是一个validation错误数组或null
  • (err, data, model) – 返回一个具有validation属性的活动logging样式的模型类。

随意提出一些不同的东西。

后续问题:论证何时应该发生? 在控制器/路由级别,数据访问级别还是SQL数据库?

  • 在这两个层面上都会有很多重复的代码。 我宁愿干。
  • 使用静态键入我会检测控制器级别的错误,并可以信任types系统。 没有静态键入的数据层不能真正相信任何人,所以它可能需要有所有的validation逻辑。
  • 错误,通常会被静态types检查拿起应该抛出错误,因为我需要修复它们。 他们是错误。 但是,如果我找不到它们,我宁愿给用户一个愉快的消息,而不是内部服务器错误500或堆栈跟踪。
  • 如果我想把它发展成一个公共的API,我肯定会需要所有的validation。

我打算使用node-validator和revalidator的组合来validation对象和参数。

Backstory:我刚刚从Scala / Play转移到Node / Express,原因是更大的社区,良好的Websockets支持和开发人员的生产力。 在开始使用Sequelize ORM之后,我认为它太约束了,创build连接时遇到了麻烦,而且我的模式也很简单,所以我开始编写原始SQL。 在开发速度提升后,我发现自己每天都需要静态input。 我写的testing和validation代码的数量要大得多。

我build议(err, data, validation)以便您可以轻松检查无效的input,用户需要重新input,以及实际的数据库错误err ,这可能会打印一个漂亮的错误信息,testing和原型。

Interesting Posts