Pure JS (4.2): Web 应用中服务器端 JS 调用 MongoDB 的简单示例
接着上一篇文章,本文将通过一个简单的示例说明如何通过服务器端 JS 调用 MogoDB,以及客户端 JS 向服务器端发起请求的方式。
首先我们可以先运行示例程序,然后我将介绍整体流程,最后我们再具体看看客户端 JS 和服务器端 JS 是如何编写的。
我们将看到通过使用 JavaScript Object 贯穿整个数据流程的模式是如何简化我们的开发的。
运行示例
下载附件,并将工程添加到 eclipse 中,配置 Java 7 JDK ,在命令行中运行 mongod;
打开文件 main/purejs/core/JSServer.java,鼠标右键 -> Run As -> Java Application 。
在浏览器中输入
http://localhost:8080 进行访问,将看到如下界面:
这个例子非常简单,只包括一个 users 列表,对每条数据可以执行两个操作:
1. 修改 description,并点击 Save 进行保存
2. 点击 Delete 删除对应的 user
最后一行用于增加 user ,可以执行两个操作:
1. 输入 name 和 description,并点击 Add 增加记录
2. 点击 Clear ,清空 name 和 description ,重新输入
每次操作完成后,users 列表将重新排序。
整体流程
我们可以直接以 JavaScript 对象作为 MongoDB 数据操作的参数,因此直接从客户端传递一个对象到服务器端是较好的方式。
引用
虽然实际上也可以从客户端传递一段代码 (Function.toString())到服务器端,但这么做具有安全隐患,因为客户端也可能传递一段具有破坏性的代码。
另外出于安全性的考虑,实际上经常需要对用户的身份和接收到的参数进行验证,这里简单起见,都省略了。
具体的步骤包括:
1.客户端 JS 处理界面事件,在 request 中指定执行操作的 controller 和 action,并将请求封装为 request.params 对象
2.服务器端接收到 request 对象后,调用所指定的 controller 的 action 函数,并将 request.params 作为参数传入
3.controller 中,通常需要从 MongoDB 获取 collection ,然后对这个 conllection 进行相应的操作。
我们可以用一张草图表示这个流程:
接下来让我们结合例子进行说明。
客户端 JS
客户端 js 位于 webapp/js/index.js ,处理界面操作,并向服务器端发起请求。
除去一些界面操作的代码,客户端向服务器端发起请求的地方有三处:
获取 users 列表
pure.post('users.list', function(data) {
users = data;
render();
});
第一个参数指定了处理请求的 controller “users” 和需要执行的操作 “list”,
第二个参数表示请求成功时执行的函数,这里将 data 赋值给闭包中的变量 users ,并渲染页面。
保存 user
pure.post({ action: 'users.save', params: user });
第一个参数采用了 request 对象的方式,包含 action 和 params 两个属性。
【action: 'users.save'】:指定了 controller “users” 和操作 “save”
【params: user】:直接将 user 作为请求参数发送到服务器端进行保存。
删除 user
pure.post({ action: 'users.remove', params: name });
【action: 'users.remove'】:指定了 controller “users” 和操作 “remove”
【params: name】:将 user 的名称作为请求参数发送到服务器端作为删除的查询条件。
pure.post 参数说明
第一个参数:request 对象,也可以接收 String 类型,将知道转为 { action: ... } 的形式。
requset 对象又可以包括两个属性:
【action】:形如 "contoller.action" 的字符串,标志处理请求的 controller ,和需要执行的操作
【params】:执行操作所需的参数,可以是 object 或基本类型。
第二个参数:请求成功时执行的函数,这个函数可以以参数形式接收返回的数据 ( result.data )
第三个参数:请求失败时执行的函数,这个函数可以以参数形式接收错误信息 ( result.error )
服务器端 JS
服务器端 js 位于 scripts/app/api.users.js,根据获得的参数,对 MongoDB 的 conllection 进行操作 。
服务器端的 api.users 对象实现了三个方法:
1. list :获取 users 列表;当 users 为空时,进行数据初始化
2. save :保存 user,以 name 作为查询条件,创建或更新 user
3. remove : 删除 user,以 name 作为查询条件移除特定的 user
实现如下:
var api = api || {};
api.users = function(){
var users = pure.db.get('users');
return {
list: function() {
if (!users.count()) {
// Initialize ...
}
return users.$list();
},
save: function(params) {
var q = { name: params.name };
users.update(q, params, true, false);
},
remove: function(params) {
users.remove({ name: params });
}
}
}();
首先通过 pure.db.get('users') 获取名为 “users” 的 collection,然后利用这个 collection 实现对应的操作。
数据初始化的代码后面还会继续探讨,这里就先省略了。
这段代码中涉及了几个 users 的方法:
users.count()
表示统计 users 的数量。
users.$list()
表示获取 users 列表, “$”表示将 DBCursor 转换为 JavaScript 数组。
这个例子是在客户端进行排序的,如果需要在服务器端进行排序,可以使用如下代码:
return user.list.$sort({ name: 1 });
users.update(q, params, true, false)
根据查询条件 q 获取对象,对象存在则更新,否则创建新的对象。
users.remove({ name: params })
根据查询条件获取对象并删除。
接下来我们看看数据初始化的部分:
pure.db.eval(function(){
var users = db.users;
users.drop();
users.ensureIndex({ name: 1 });
users.insert({ name: 'user1', desc: 'desc1' });
users.insert({ name: 'user2', desc: 'desc2' });
users.insert({ name: 'user3', desc: 'desc3' });
});
我们使用 eval 进行数据的初始化,pure.db.eval 可以接受 String 或 Function 类型的参数,Function 实际上也是转为 String 执行的。
初始化的操作包括:
1.通过 users.drop() 删除 collection
2.在 name 上建立索引,并且排序方式为升序
3.插入三个 users 对象
总结
客户端和服务器端都使用 JavaScript 进行编程,MongoDB 也有支持 JavaScript 的API,因此我们可以以一个 JavaScript 对象作为参数贯穿整个流程;
这将大大简化我们的开发,并且理解上也十分直观,这也正是“ Pure JS ”想要达到的效果。
下一篇文章将介绍 pure.db.js 是如何对 MongoDB 的数据操作进行封装的,以及一些与 MogoDB Driver 有关的内容。
分享到:
相关推荐
法国Embouchure地区沉积物岩性数据集 内容 该数据集由O. Puertas在2014年发布,详细记录了法国Embouchure地区的EMBOU岩芯沉积物的岩性特征。数据集中包含了39个数据点,提供了关于该地区沉积环境的重要信息。欲了解更多信息,请访问"PANGAEA数据库中的原始数据" ()。
BH1750光照强度传感器
基于多目标粒子群算法的分布式电源选址定容与优化配置研究——基于MATLAB的程序实践与优化探讨,基于多目标粒子群算法的分布式电源选址定容与优化配置MATLAB程序:含规划模型、算法求解及参考文章赠阅,分布式电源选址定容与优化配置MATLAB程序基于多目标粒子群算法 (1)该程序为基于多目标粒子群算法的分布式电源优化配置与选址定容程序,期刊lunwen源程序,配有该lunwen。 (2)本程序可有效配置分布式电源容量与安装位置。程序与lunwen包含的内容有综合成本、网损、电压稳定裕度为目标函数建立分布式电源的规划模型、多目标粒子群算法、IEEE-69节点的算例求解。 (3)赠送若干极为相似的参考lunwen,均为本人研究该课题期间认为非常系统、全面、易懂、基础的文章。 ,1. 多目标粒子群算法; 2. 分布式电源优化配置; 3. 分布式电源选址定容; 4. MATLAB程序; 5. 综合成本; 6. 网损; 7. 电压稳定裕度; 8. IEEE-69节点; 9. 参考lunwen(或相关文章),基于多目标粒子群算法的分布式电源选址定容与优化配置MATLAB程序:成本、网损与电压稳定的综
sediment core GeoB17620-1的文档记录 内容 Lucchi, RG; Sabbatini, A; Nicolaisen, LS 等(2014年)提供的sediment core GeoB17620-1的文档记录。详细信息请访问"此链接" ()以获取完整的数据集文档和相关信息。请注意,文档的具体大小未知。
该项目是一款多语言心理咨询网站前端开发设计源码,包含7166个文件,涵盖2646个PHP文件、1419个JavaScript文件、650个GIF文件、417个HTML文件、318个PNG文件、263个LESS文件、236个Vue文件、219个JSON文件、183个Markdown文件、142个文本文件。主要采用JavaScript进行开发,同时融入PHP、TypeScript、Shell等多种语言技术。这套源码旨在提供全面的心理咨询服务网站界面设计。
显微镜下染色体图像分割系统:新手入门宝典
物品识别与分类系统源码和数据集:改进yolo11-HWD
【C#】Grpc扩展是一个基于GRPC的简单微服务框架
【GO】基于go实现的生日提醒定时任务
深海沉积物岩芯GeoB17624-3的文档记录 内容 Lucchi, RG; Sabbatini, A; Nicolaisen, LS 等(2014)提供的文档包括了对深海沉积物岩芯GeoB17624-3的研究资料。该研究的具体数据集大小未知,但已通过PANGAEA数据库发布,可供进一步学术研究和参考。可通过以下链接访问完整数据集:"" ()。
外科工具实例分割系统源码和数据集:改进yolo11-convnextv2
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
AI人脸识别学习,使用opencv2
内容概要:本通知介绍了西安邮电大学将举办的2024年第29届“21世纪杯”全国大学生英语演讲比赛的具体情况。活动目的是提升学生讲好中国故事的能力,促进文化交流与构建人类命运共同体。此次活动的主题是传统文化的复兴。主要内容涵盖比赛的背景介绍、参赛对象限定以及具体报名方式及时间节点。此外还详细讲解了演讲主题及视频上传的要求。评分标准从内容质量、语言表述、整体表现等方面进行了明确规定。获奖学生不仅将得到相应的表彰奖励,还有可能代表西安邮电大学参与到更高层级的比赛当中去。 适合人群:全体在校本科生,尤其是对外语学习感兴趣的师生;以及对于传统文化复兴有兴趣的年轻人。 使用场景及目标:此活动鼓励学生积极参与英语演讲竞技,提高自己的英语表达能力和综合素质,同时也有助于推广中国传统优秀文化传播。 其他说明:研究生(青年组)需要直接通过官网报名并且不受本次比赛限制;此外,该次比赛的成绩还将影响其他英语演讲系列竞赛的表现评估体系。未尽事宜将在日后进一步发布。
该项目是一款采用Java编写的自然管理后台设计源码,包含共计126个文件,涵盖95个Java源代码文件、18个XML配置文件、5个YAML文件、4个Git忽略文件、4个属性文件以及其他类型文件。此系统专注于后台管理功能,适用于各种管理场景。
太阳能光伏面板分割系统:基础知识铺垫
光伏混合储能直流微网中基于PI控制的直流母线电压下垂控制模型研究与应用,光伏混合储能直流微网中基于PI控制的直流母线电压下垂控制模型研究与应用,光伏混合储能直流微网直流母线电压下垂控制控制模型 在基于储能单元SOC的下垂控制方法基础上,下垂系数不断变化,通过加入PI二次控制,将控制器输出量与储能单元变器输出电压和母线电压稳定值相叠加,对母线电压的跌落和和上升进行补偿和抑制。 效果明显 也可以改mppt控制方法或者改局部遮阴 ,光伏混合储能、直流微网、下垂控制、PI二次控制; SOC下垂控制方法; 电压稳定性提升; MPPT控制方法调整。,光伏混合储能直流微网电压控制模型:动态下垂系数与PI二次控制
STM32+MPU6050+OLED
手指五指图像分割系统:50+创新改进
手指关节分割系统:视觉算法突破