您应该在哪里验证/清理数据?

时间:2015-04-27 22:09:31

标签: javascript node.js validation

我正在构建一个传统的MVC应用程序。我有一个/ lib文件夹,它定义了处理数据库操作和处理外部API的函数。处理用户输入时,我应该在哪里验证数据?我应该在路由控制器中验证它,然后将验证的数据发送到数据库函数吗?或者我应该在路由控制器中不进行验证并让/ lib文件夹中的函数进行所有验证吗?

2 个答案:

答案 0 :(得分:2)

对我而言,最自然的地方是模型,因为它包含数据。 GRASP专家原则表明,您应该将责任分配给具有实现这些信息的对象。

我们可以争辩说控制器可能具有进行验证所需的所有信息(数据),但对我来说,控制器应该很轻。此外,我认为“所有信息”不仅意味着您必须验证数据,还意味着它的格式,这就是模型的关注点。控制器可能知道某个模型所需的数据应该如何,但该模型也可以在该控制器范围之外使用,因此它不应该依赖于控制器的验证才能正常工作,因为该模型(几乎)是您最后的机会。检测无效数据(您可以而且必须在数据库上执行此操作,但数据应该在进入数据之前进行验证和清理,尽管通常数据库模式与您应该在模型中进行的验证之间存在直接匹配)

每次使用模型进行CRUD操作时,您可能需要验证数据,并确保数据几乎始终正确。此外,控制器还可以更改然后进入该模型的数据,因此即使控制器先前验证了它,也可能产生无效数据。

然而,请考虑一下。控制器可能会更改数据,实际上很多时候都会这样做。在表单和模型中的字段之间始终具有直接映射是不常见的,有时您将获得与任何模型无关或几乎没有任何模型的输入,因此您应该在模型外部验证它们。例如,考虑“重复密码”字段。它与模型无关!只有“密码”字段才能到达。

其他人会说他们更喜欢anemic models并且在某些情况下它们可能比丰富的模型更合适,但它们也有一些缺点,而且丰富的一般最适合。

您还应该考虑在客户端(即JS)进行验证,以便您可以快速反馈他正在做什么,而不是将数据发送到服务器进行验证,然后等待响应甚至加载整个页面再次出现!

这样做的一个好方法是使用正则表达式,因为您在使用的不同语言之间会有类似的表达方式,尽管这往往是不够的。或者更好的是,你可以在任何地方使用JS与Node.js完全忘记这个问题。

这可能不是您正在寻找的答案,但是不仅有一种正确的方法可以进行验证,因为每种应用程序都有不同的方法。大多数情况下,验证应该在不同的地方进行,在应用程序的某些不同层中进行相同的验证,在其他一些层之间进行不同的验证。

StackOverflow上有关于此主题的更多问题,因此您可以检查它们以获得其他人的不同意见:

答案 1 :(得分:1)

我见过的最好的方法之一是使用装饰器在它们顶部定义服务和层验证。如果发生验证错误,则会引发包含验证错误的自定义异常,该错误由控制器捕获并处理并发送回客户端。

控制器应该很薄,并处理请求和响应等事情而不是业务逻辑。无论你使用什么方法,我都建议你试着让它与控制器分离。