Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在客户端和服务器之间共享Javascript业务规则?_Angularjs_Node.js_Express_Mean Stack - Fatal编程技术网

Angularjs 如何在客户端和服务器之间共享Javascript业务规则?

Angularjs 如何在客户端和服务器之间共享Javascript业务规则?,angularjs,node.js,express,mean-stack,Angularjs,Node.js,Express,Mean Stack,我正在创建一个平均堆栈,我想澄清以下内容 从编码标准的角度来看,我知道验证应该在客户端和服务器端执行。我想要实现的是执行完全相同的验证代码,这样我就不会再次重复代码。这更像是客户端和服务器端的共享代码 那么,如何让angular js和Express js调用相同的.js文件来执行验证呢?有可能吗 谢谢 你肯定能做到。RemObjects DataAbstract()使用这种方法。这里的原则是定义业务规则,这些规则要么应用于客户端和服务器,要么仅应用于服务器。您几乎不必只在客户机上检查业务规则,

我正在创建一个平均堆栈,我想澄清以下内容

从编码标准的角度来看,我知道验证应该在客户端和服务器端执行。我想要实现的是执行完全相同的验证代码,这样我就不会再次重复代码。这更像是客户端和服务器端的共享代码

那么,如何让angular js和Express js调用相同的.js文件来执行验证呢?有可能吗


谢谢

你肯定能做到。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'); }
})