假设我正在使用存储库模式进行数据访问,如下所示:
#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)
- A
user
存在验证错误,例如缺少字段等。 - 用户已经存在
user.email
。
我的问题是如何在回调中返回这些错误中的每一个?
回调参数的选项:
(err, data)
- 其中err
是遇到的所有错误的数组。(err, data)
-err
验证错误在哪里,数据库错误作为异常抛出。(err, data)
- 与上面相同,但当它user
已经存在时它返回 null,因为这不是错误而是预期的行为。(err, data, validation)
-validation
验证错误数组或null
.(err, data, model)
- 返回具有验证属性的模型类 - 活动记录样式。
随意提出不同的建议。
后续问题:应该在哪里验证论点?在控制器/路由级别、数据访问级别或 SQL 数据库?
- 在这两个级别上都会有很多重复的代码。我宁愿干。
- 使用静态类型,我可以在控制器级别检测错误,并且可以信任类型系统。如果没有静态类型,数据层就不能真正信任任何人,因此它可能需要具有所有验证逻辑。
- 静态类型检查通常会发现的错误应该会引发错误,因为我需要修复它们。他们是虫子。但是,如果我没有找到它们,我宁愿给用户一个愉快的消息,而不是内部服务器错误 500 或堆栈跟踪。
- 如果我想把它演变成一个公共 API,我肯定需要所有的验证。
背景故事:出于更大的社区、良好的 web-sockets 支持和开发人员生产力的原因,我刚刚从 Scala/Play 转到 Node/Express。在开始使用Sequelize ORM 后,我认为它太受限制,无法创建连接,而且我的模式很简单,所以我开始编写原始 SQL。在开发速度得到初步提升后,我发现自己每天都想要静态输入。我正在编写的测试和验证代码的数量要大得多。