简而言之,当我在应用程序中进行交易,更改用户昵称时,我想从firebase / firestore中获得有意义的验证错误。
我正在努力寻找一种好的方法。让我通过这个简单的示例进行解释:
React Native中用户配置文件页面的“昵称” TextInput。 用户可以更改“昵称”值,然后单击“保存”。 如果昵称字符串有任何问题,则会向用户显示有意义的错误/反馈,例如:昵称太短/太长。昵称包含坏词。昵称已被使用。
点击“保存”后,我已经通过使用Cloud Functions和来自应用程序的https调用完成了此操作。这使我可以向用户显示任何输入验证错误,因为这是对服务器的正确请求,在服务器上我可以抛出可以直接显示给用户的错误。但是感觉...笨拙吗?
昵称本身的服务器端验证将检查长度> 4 &&长度<20,并检查用户名的唯一性,再加上一些检查不良单词的方法。通过使用已经使用昵称的Firestore集合来实现唯一性。
真的没有更简单的方法可以做到这一点吗?以上是最好的方法吗?
如果我能以某种方式在firestore规则中引发错误并在客户端捕获该错误,然后将其显示给用户,那将很容易-然后我可以在firestore规则中使用regex等进行所有验证。但是我所看到的只是允许和拒绝-它是完全基于访问的,因此,如果我尝试进行任何验证,则用户最终将获得“权限被拒绝”。因此,我既要在Firestore中执行规则(出于安全性考虑),又要在客户端编写验证以向用户显示有意义的错误(即除非有效,否则客户端不会发送任何数据)。如果没有客户端验证,尝试使用firebase.firestore.doc('users / blahblah')。update({昵称:new_value})直接更新时,它只会抛出“权限被拒绝”错误。
这当然是可行的,但不如让服务器进行验证并发出错误消息那样灵活-节省了很多打字时间-如果以后要添加更多验证规则,则不需要更新应用程序-可以只需在服务器上完成即可。
我只是觉得通过firebase.firestore函数在应用程序中进行简单交易并能够捕获错误会更加优雅。
我感觉自己可能会缺少一些东西,但是我花了两天时间搜寻Google,阅读了所有的firebase + firestore文档和react-native-firebase文档+示例。因此,我希望这里的人也有类似的情况,花了几分钟时间来保留一些智慧:)
干杯!
答案 0 :(得分:1)
因此,您想要的是在数据库内部实现应用程序逻辑。那完全没问题。您的模型(实体)具有在客户端(用户界面)和服务器端(服务器应用程序)定义的验证规则。
为了以所需的方式集中验证,您必须在数据库函数和/或触发器中移动所有规则。那是我永远不会推荐的事情,因为您将以某种方式在数据库层内部建立应用程序的非常重要的部分。在该步骤之后,您仍然必须将所有错误委托给服务器应用程序层,然后再委托给用户,因为您需要正确地授权用户。
要回答这个问题-是。这是进行验证的最佳方法-在 APPLICATION LAYER 中。不用理会数据库,那只是一个存储。是的,您可以在那里复制一些规则,但这几天只是一个好的习惯。
另一方面,如果您读了一些有关数据库设计以及那里的工作方式的书,则会发现有力的建议,可以为针对特定模型插入/更新的对象实施非常严格的规则。
因此,经过所有这些阅读之后,您将获得以下验证:
没有不增加灵活性的集中验证的简便方法。
答案 1 :(得分:0)
在设计用户友好界面的情况下,应通过使用HTTP状态代码映射错误消息,用有意义的消息适当地修饰错误消息:
200 - valid input
422 - input should meet certain criteria
在您的情况下,一种方法可能是向服务器发送HTTP请求(当字符> 4时,在每次用户点击时,都将其禁用),直到保存成功后,才禁用SAVE按钮。
仅当满足以下条件时,云HTTP调用才应以200状态响应:
否则,非成功代码应从服务器返回(可用于与用户友好的消息进行映射以显示给用户)。 HTTP代码的映射可以在客户端或服务器端进行。