当前位置:嗨网首页>书籍在线阅读

17-验证对象

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.4.2 验证对象

浏览器客户端发送给服务器的 JSON 文档代表一个对象。很多读者肯定知道,很多Web API都使用JSON,JSON已经取代了XML,因为它更简洁,更容易处理。

XML 提供的一个主要功能是定义 DTD(Document Type Definition,文档类型定义), DTD描述允许的内容。JSON有类似的功能,然而还不够成熟,没有确保和DTD类似的文档内容的标准。它叫做JSON schema。

JSV 是一款使用JSON schema的验证器。浏览器和服务器都可以使用,所以不必编写或者维护两份单独的(总是会产生难以捉摸的冲突)验证库。下面是验证对象需要的步骤。

安装JSV的node模块。

创建JSON schema。

加载JSON schema。

创建验证函数。

验证进入的数据。

第一步是安装JSV。

1.安装JSV的node模块

更新package.json 文件,引入JSV 4.0.2,如代码清单8-13所示。

代码清单8-13 更新清单,引入JSV——webapp/package.json

figure_0295_0428.jpg figure_0296_0429.jpg 在运行npm install 时,npm会检测到更改并安装JSV。

2.创建JSON schema

在可以验证用户对象之前,必须决定什么属性是允许的,它们的值可能是什么。JSON schema提供了很好的标准机制来描述这些约束,如代码清单8-14所示。请一定要仔细地注意注释,因为它们说明了约束的内容。

代码清单8-14 创建用户schema——webapp/user.json

figure_0296_0430.jpg 你可能已经注意到,我们定义了一个约束对象以及约束这个对象中的对象的schema。这说明了JSON schema 是可以无限递归的。JSON schema 也可以扩展其他的schema,很像XML。若想了解更多关于JSON schema 的信息,请查看官方网站json-schema.org。现在可以加载schema,确保接收到的任何用户对象只包含我们允许的数据。

3.加载JSON schema

在启动服务器的时候,把schema文档加载到内存里面。这将避免在服务器应用运行期间,进行昂贵的文件查找操作。可以为在对象类型映射(objTypeMap)中定义的每个对象类型加载一个schema,如代码清单8-15所示。更改部分以粗体显示。

代码清单8-15 在路由中加载schema——webapp/routes.js

figure_0297_0431.jpg figure_0298_0432.jpg 现在已经加载了schema,我们可以来创建验证函数。

4.创建验证函数

现在已经加载了user的JSON schema,我们想把来自客户端的数据与之进行比较。代码清单8-16演示了使用一个简单的函数来完成这个功能。更改部分以粗体显示。

代码清单8-16 添加函数来验证文档——webapp/routes.js

figure_0298_0433.jpg figure_0299_0434.jpg 现在已经加载了JSON schema 并且创建了验证函数,我们可以验证来自客户端的数据了。

5.验证来自客户端的数据

现在可以来完成验证程序。只需要修改路由(创建和更新部分),对来自客户端的数据进行验证即可。在每一种情况下,如果错误列表是空的,则执行请求操作,否则返回错误报告,如代码清单8-17所示。更改部分以粗体显示。

代码清单8-17 给创建和更新的路由加上验证——webapp/routes.js

figure_0299_0435.jpg figure_0300_0436.jpg figure_0301_0437.jpg 现在已经完成了验证程序,来看一下我们所做的成果。首先要确保所有的模块通过JSLint(jslint user.json app.js routes.js),然后启动应用(node app.js)。然后可以使用灵巧的wget技术POST错误的和正确的数据,如代码清单8-18所示。输入以粗体显示。

代码清单8-18 使用灵巧的wget 技术POST 错误的和正确的数据

figure_0301_0438.jpg figure_0302_0439.jpg 使用wget更新用户,这个留给读者作为练习。

在下一小节,我们将会把 CRUD 功能移到单独的模块里面。这样就会更整洁,更容易理解,代码也更容易维护。