深圳网站优化推广公司 版权所有

粤ICP备15021922号 XML地图

深圳布吉网站推广公司

[深圳网站制作]基于Node.js、Express和Jscex开发的ToDo网站示例

编辑:布吉网络公司 | 日期:2021-06-12 21:39 | 人气:

基于Node.js、Express和Jscex开发的ToDo网站示例

Jscex的主要使用场景是“JavaScript异步编程”,不过并没有限制是跑在浏览器还是服务器端。最近Node.js很火热,也刚发布了原生的Windows版,不少同学会用它来做一些网站这样的小程序。目前用Node.js开发网站最***的框架是Express,使用起来也是比较容易的。前段时间看到CNodeJS社区的一篇文章,有同学将一个Python写的ToDo列表网站移植到了Node.js上,我为了推广Jscex,就fork了这个项目,将其修改为基于Jscex的版本,大伙儿可以来比较一下。当然这个网站过于简单,我也正在寻找更合适的项目。(网站制作)
51CTO推荐专题:Node.js专区
JavaScript是一个没有阻塞特性的语言,因此各类API都会设计为异步,这对于服务器的伸缩性和客户端网页的响应能力都有好处,不过在程序编写上就会遇到各种问题了。例如在ToDo示例中的一个简单的处理函数,因为需要查询数据库,就要写成带回调的样子:
  1. exports.index=function(req,res,next){
  2. db.query('select*fromtodoorderbyfinishedasc,idasclimit50',function(err,rows){
  3. if(err)returnnext(err);
  4. res.render('index',{todos:rows});
  5. });
  6. };
db变量用来操作MySQL数据库,它的query方法传入sql(可能还会有参数)并提供一个回调函数,用来提示错误或是返回查询结果。在回调中我们必须判断err是否存在,如果存在便调用next报告框架“出错了”。每个异步操作都必须如此,试想如果在这个查询后还有另一个查询,则还需要进行一次嵌套和err判断。每个处理函数都是如此,这也是异步编程的烦恼之一:难以进行统一的异常处理,处理代码总是需要分散在各处,一不小心就变成“野异常”,还很难排查出来。
我将ToDo网站简单地Jscex化了一下。首先让MySQL的查询能够接入Jscex(libjscex.mysql.js):
  1. exports.jscexify=function(db){
  2. db.queryAsync=function(){
  3. var_this=this;
  4. varargs=[];
  5. for(vari=0;i<arguments.length;i++){
  6. args.push(arguments[i]);
  7. }
  8. vardelegate={
  9. onStart:function(callback){
  10. args.push(function(err,result){
  11. if(err){
  12. callback("failure",err);
  13. }else{
  14. callback("success",result);
  15. }
  16. });
  17. _this.query.apply(_this,args);
  18. }
  19. };
  20. returnnewJscex.Async.Task(delegate);
  21. }
  22. }
一般来说,将一个异步接口给Jscex化并不需要那么多代码(最关键的其实只是onStart函数)。这里近30行代码,其中大部分是为了支持“变长”参数,因此queryAsync函数会保留调用时的所有参数,补上一个callback,再去调用query函数本身。此时,便可以去改写之前的index等处理函数了(controllerstodo.js),例如:
  1. exports.index=toHandler(eval(Jscex.compile("async",function(req,res){
  2. vartodos=$await(db.queryAsync('select*fromtodoorderbyfinishedasc,idasclimit50'));
  3. res.render("index",{todos:todos});
  4. })));
toHandler函数的作用,是将一个“接受req和res,返回Task”的函数,封装成标准的“接受req、res和next三个参数”的处理函数,并提供统一的错误处理:
  1. vartoHandler=function(asyncFunc){
  2. returnfunction(req,res,next){
  3. vartask=asyncFunc(req,res);
  4. task.addListener(function(){
  5. if(task.status=="failed"){
  6. next(task.error);
  7. }
  8. });
  9. task.start();
  10. }
  11. }
我在todo.js里保留了原有各个处理函数的实现,感兴趣的朋友可以对比一下它们之前的差别。可惜的是,由于ToDo实在过于简单,Jscex的优势并没有表现出来太多。例如,每个处理程序中只有一个MySQL查询,没有判断和循环,更别说为了充分利用IO并发能力,从而组合多个异步函数了。因此,我最近也一直在寻找更复杂一些的示例,不过似乎用Express的开源网站并不多见,我几乎都想自己写一个了。目前感觉Nodepad似乎还算不错,接下来可能会对它下手。
ToDo网站依赖Express,ejs和MySQL驱动,同时我把Jscex作为添加为它的子模块。如果您要克隆一份ToDo的代码把玩一番,可以:
  1. >gitclonegit://github.com/JeffreyZhao/todo.git
  2. >cdtodo
  3. >gitsubmoduleinit
  4. >gitsubmoduleupdate
  5. >npminstallexpressejsmysql
  6. >nodeserver.js
从现在开始,我会在InfoQ中文站上发表一系列关于Jscex的文章,既有关于浏览器端的JavaScript开发,也有在服务器端利用Node.js开发的内容。可能您目前还可能会有所疑惑,例如为什么要使用危险的eval函数,eval和Jscex.compile函数不能封装起来吗?其实在看了我的文章并对Jscex有了基本了解之后,就会发现这些都是以“传统眼光”来看待Jscex时所形成的误解。Jscex的做法的确“另辟蹊径”,否则在JavaScript异步类库已经多如牛毛的情况下,我不知如何让它脱颖而出。(高端网站建设)
深圳市圣玺网络技术有限公司擅长提供布吉区域网站建设、网页设计制作、网站优化推广、SEO按天按效果付费、万词霸屏包年推广、抖音获客霸屏、百度爱采购等关键词SEO排名广告服务!
本文由网上采集发布,不代表本站立场,转载联系作者并注明出处:http://www.amerbiz.com/wzjs/8987.html
X

截屏,微信识别二维码

微信号:15019448256

(点击微信号复制,添加好友)

  打开微信