Angularjs 如何在客户端和服务器之间共享Javascript业务规则?
我正在创建一个平均堆栈,我想澄清以下内容 从编码标准的角度来看,我知道验证应该在客户端和服务器端执行。我想要实现的是执行完全相同的验证代码,这样我就不会再次重复代码。这更像是客户端和服务器端的共享代码 那么,如何让angular js和Express js调用相同的.js文件来执行验证呢?有可能吗Angularjs 如何在客户端和服务器之间共享Javascript业务规则?,angularjs,node.js,express,mean-stack,Angularjs,Node.js,Express,Mean Stack,我正在创建一个平均堆栈,我想澄清以下内容 从编码标准的角度来看,我知道验证应该在客户端和服务器端执行。我想要实现的是执行完全相同的验证代码,这样我就不会再次重复代码。这更像是客户端和服务器端的共享代码 那么,如何让angular js和Express js调用相同的.js文件来执行验证呢?有可能吗 谢谢 你肯定能做到。RemObjects DataAbstract()使用这种方法。这里的原则是定义业务规则,这些规则要么应用于客户端和服务器,要么仅应用于服务器。您几乎不必只在客户机上检查业务规则,
谢谢 你肯定能做到。RemObjects DataAbstract()使用这种方法。这里的原则是定义业务规则,这些规则要么应用于客户端和服务器,要么仅应用于服务器。您几乎不必只在客户机上检查业务规则,因为您永远不能“信任”客户机检查您的业务规则 CQRS和DDD是两个架构原则,可以在这里帮助您。领域驱动的设计将有点“干净”或“精炼”您的代码,将基础设施从核心的“领域”逻辑中推开。而且业务规则只适用于域,因此最好将域与其他域隔离开来 命令查询责任分段。我非常喜欢这个。基本上,您可以定义一组命令,这些命令将在应用之前进行验证。再也没有类似Model.Set('a',2)的机器代码了。使用此原则,您的代码看起来像MyUnderstandableBusinessObject.UnderstandableCommand(aFriendlyArgument)。当涉及到应用业务规则时,这非常方便,因为您的实际命令反映了您的域的用例 在处理node.js/javascript项目时,我也经常遇到这个问题。问题是您没有一个客户机和服务器都能理解的标准化ORM。这是paradoxal,因为node.js和浏览器运行在同一种语言上。当我被Node.js吸引时,我告诉自己,客户机和服务器都运行相同的语言,这将节省很多时间。但这有点错误,因为即使npm真的很活跃,也没有那么多成熟和专业的工具 我也想构建一个客户机/服务器都能理解的ORM,并向其添加一个关系方面(以便与SQL兼容),但我放弃了这个项目 但是,还有一些其他的解决方案。是一个,而且很轻 这里的业务规则检查的实际实现是您将要处理的。您需要将“验证”部分从模型中提取到另一个可以共享的对象中。让你开始的东西:
编辑2 我想在第一个回答中纠正一个小细节。不要在属性设置器上实现您的业务规则!请改用业务操作名称: 必须确保始终通过方法设置模型属性。如果您通过赋值直接设置模型属性,那么您就绕过了整个业务规则处理器 廉价的方法是通过标准制定者,如
SetMyProperty(value);
SetAnotherProperty(value);
这是一种低级业务规则逻辑(基于getter和setter)。然后,您的业务规则也将是低级的。这有点糟糕
更好的方法是,您应该通过业务可理解的高级方法名称(如
RegisterClient(client);
InvalidateMandate(mandate);
然后,您的业务规则变得更加容易理解,您几乎可以很好地实现它们
BusinessRuleRepository.add(ModelClass, "RegisterClient", function(){
if (!Session.can('RegisterClient')) { fail('Unauthorized'); }
})
非常感谢您花时间回答这个问题。
RegisterClient(client);
InvalidateMandate(mandate);
BusinessRuleRepository.add(ModelClass, "RegisterClient", function(){
if (!Session.can('RegisterClient')) { fail('Unauthorized'); }
})