首页 > 解决方案 > 用户输入验证的最佳方法?

问题描述

简而言之,在更改用户昵称时,在应用程序中进行事务时,我希望从 firebase/firestore 获得有意义的验证错误。

我正在努力寻找一个好的方法。让我通过这个简单的例子来解释:

React Native 中用户个人资料页面的“昵称”TextInput。用户可以更改“昵称”值并单击保存。如果昵称字符串有任何问题,则会向用户显示有意义的错误/反馈,例如:昵称太短/太长。昵称包含坏词。昵称已被使用。

我已经通过使用 Cloud Functions 和单击保存时来自应用程序的 https 调用来完成此操作。这允许我向用户显示任何输入验证错误,因为这是对服务器的正确请求,我可以在其中抛出一个可以直接向用户显示的错误。但感觉……笨拙?

昵称本身的服务器端验证会检查长度 > 4 && 长度 < 20,以及检查用户名的唯一性,以及一些对坏词的检查。唯一性是通过拥有一个已使用昵称的 firestore 集合来完成的。

真的没有更简单的方法来做到这一点吗?以上是最好的方法吗?

如果我能以某种方式在 firestore 规则中抛出错误并在客户端捕获它,然后将其显示给用户,那将很容易 - 然后我可以在 firestore 规则中使用正则表达式等进行所有验证。但我所看到的只是允许和拒绝——它纯粹是基于访问的,所以如果我尝试进行任何验证,用户最终会得到“权限被拒绝”。所以我必须在firestore中执行规则(为了安全),并在客户端编写验证以向用户显示有意义的错误(即客户端不发送任何数据,除非它是有效的)。如果没有客户端验证,它只会在尝试使用 firebase.firestore.doc('users/blahblah').update({nickname: new_value }) 直接更新时抛出“权限被拒绝”错误。

这当然是可行的,但不如让服务器验证并发出错误消息那么灵活 - 节省了大量的输入 - 如果我以后必须添加更多验证规则,则不需要更新应用程序 - 可以做到在服务器上。

我只是觉得通过 firebase.firestore 函数在应用程序中进行简单的事务会更优雅,并且能够捕获错误。

我觉得我可能遗漏了一些东西,但我花了两天时间搜索 Google,阅读了所有的 firebase + firestore 文档和 react-native-firebase 文档 + 示例。所以我希望这里有人在几分钟内处于类似情况,以节省一些智慧:)

干杯!

标签: google-cloud-firestorereact-native-firebase

解决方案


所以你想要的是在数据库中实现一个应用程序逻辑。那完全没问题。您的模型(实体)在客户端(用户界面)和服务器端(服务器应用程序)上定义了验证规则。

为了以您想要的方式集中验证,您必须将所有规则移动到数据库函数和/或触发器中。这是我永远不会推荐的东西,因为您将以某种方式将应用程序的一个非常重要的部分建立在数据库层中。在该步骤之后,您仍然必须将所有错误委托给服务器应用程序层并返回给用户,因为您需要正确授权用户。

所以回答这个问题 -的。这是在APPLICATION LAYER内部进行验证的最佳方式。不用管数据库,那只是一个存储。是的,您可以在那里复制一些规则,但这只是如今的良好做法。

另一方面,如果您阅读了一些有关数据库设计以及那里的工作原理的书籍,您会发现强烈建议为特定模型插入/更新的对象实施非常严格的规则。

因此,在阅读完所有内容后,您最终将获得以下验证:

  1. 用户界面
  2. 应用层
  3. 数据库层

在不失去一些灵活性的情况下,没有简单的方法可以集中验证。


推荐阅读