我正在调查JavaScript模板,以此来呈现我们的观点.目标是能够为已启用JavaScript的用户呈现客户端,以便为那些没有启用JavaScript的用户(和爬虫)呈现相同的模板/数据服务器端.
要求
到目前为止找不到令人满意的解决方案
作为广泛的测试用例的一部分,我正在构建一个基于ajax的类似CMS的应用程序,它在各种文档类型上提供CRUD功能,例如:文章,标签等.
在服务器端和客户端,我正在考虑使用JSON-schema(http://json-schema.org/)作为以干燥方式进行用户输入验证的方式(即:1验证模式,是在服务器端和客户端使用,没有重复代码和所有这些).这看起来很棒,因为:
JSON-schema都是用JS和Java实现的,因此理论上一个模式可以处理客户端和服务器端验证
所有CUD操作请求和响应都是JSON(通过ajax)
然而,除了用户输入的常规验证之外,我还希望在服务器上进行一些额外的检查(例如:检查用户想要创建的Tag的名称是否已经存在)
理想情况下,我希望这些类型的检查包含在我的一般服务器端验证代码中(如上所述,它将基于JSON模式).但是,我并不完全相信这是正确的方法,因为这些额外的检查不仅仅基于提供的JSON数据,而是需要额外的数据来验证(例如:系统中现有标签的名称,以检查是否标签名已经存在).
那么,在服务器端的基于json模式的验证框架中加入如上所述的附加检查是否是一个好主意(设计/架构明智)?这会是一个优雅的解决方案吗?或者你会完全分开吗?如果没有,为什么不这样做,你会建议在客户端和服务器端验证方面保持DRY吗?
你怎么看?
一些背景信息下面的文本案例的一些额外的上下文/目标.
谢谢,Geert-Jan
一些背景/目标:
基于ajax的CMS使用REST方法
CUD请求通过ajax使用rest方法执行(即:分别在POST,PUT,DELETE上映射).请求和响应都是通过JSON完成的.
没有表格的CMS.而是使用就地编辑(例如使用Aloha编辑器:http://www.aloha-editor.org/
保持干燥.
模板化:通过客户端和服务器端的Mustache模板完成.通过ajax进行初始渲染和增量渲染是基于1和相同的模板完成的.我想寻找与Mustache不同的东西(bc.它缺乏表现力),但它至少适用于这个原型.(请参阅上一个替代方案的问题,我仍在寻找答案:使用java编译器的客户端模板语言(DRY模板))
DRY输入验证:如上所述
验证流程(如果失败):
用户创建/更新/删除项目.
客户端上的验证失败会立即向用户反馈修复内容.(Javascript JSON-schema-validator理想情况下会返回格式化为用户的JSON)
当客户端验证成功时,使用ajax执行CUD操作.
如果服务器端验证失败,则返回状态代码400(错误请求),其中包含由jquery的错误回调拾取的验证失败的Json对象
$.ajax({
....
error: function(xhr, status, error) {
var validationJSON = JSON.parse(xhr.responseText);
//handle server-side validation failure
},
....
});
Run Code Online (Sandbox Code Playgroud)包含服务器端验证失败的JSON对象呈现给用户(类似于客户端)
我正在构建一个Rails应用程序,它使用Pusher来使用Web套接字将更新直接推送到客户端.在javascript中:
channel.bind('tweet-create', function(tweet){ //when a tweet is created, execute the following code:
$('#timeline').append("<div class='tweet'><div class='tweeter'>"+tweet.username+"</div>"+tweet.status+"</div>");
});
Run Code Online (Sandbox Code Playgroud)
这是令人讨厌的代码和演示混合.所以自然的解决方案是使用javascript模板.也许生态或胡子:
//store this somewhere convenient, perhaps in the view folder:
tweet_view = "<div class='tweet'><div class='tweeter'>{{tweet.username}}</div>{{tweet.status}}</div>"
channel.bind('tweet-create', function(tweet){ //when a tweet is created, execute the following code:
$('#timeline').append(Mustache.to_html(tweet_view, tweet)); //much cleaner
});
Run Code Online (Sandbox Code Playgroud)
这很好,除了我重复自己.胡子模板与我已编写的用于从服务器呈现HTML的ERB模板99%相同.小胡子和ERB模板的预期输出/目的是100%相同:将tweet对象转换为tweet html.
消除这种重复的最佳方法是什么?
更新:即使我回答了我自己的问题,我真的希望看到其他人的其他想法/解决方案 - 因此是赏金!
我正在尝试通过套接字将数据从node.js发送到Java.我四处搜索,但没有什么是真正有用的.我习惯了socket.io,但在这种情况下它似乎并不适合这个.似乎node.js的所有套接字扩展都不适合发送消息,而是听取消息和回答某些内容.
我的Java应用程序基本上应该从node.js接收一些工作,完成工作并将一些结果发送回node.js.不,这项工作不能在node.js上完成,它必须由Java完成(实际上是Scala,但无论如何).
你们有谁知道我怎么能这样做?
谢谢
javascript ×3
dry ×2
client-side ×1
java ×1
json ×1
mustache ×1
node.js ×1
server-side ×1
sockets ×1
templates ×1
validation ×1