【北京网站制作】基于Node.js、Express、Jscex开发的ToDo网站实例
  • 更新时间:2024-05-02 07:16:56
  • 网站建设
  • 发布时间:1年前
  • 696

基于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例子中一个简单的处理函数,因为需要查询数据库,所以需要写一个回调:

exports.index=function(req,res,next){

db.query('select*fromtodoorderbyfinishedasc,idasclimit50',function(err,rows){

if(err)returnnext(err);

res.render('index',{todos:rows});

});

};

db变量用于操作MySQL数据库。它的查询方法传入sql(可能有参数),并提供回调函数来提示错误或返回查询结果。在回调中,我们必须判断err是否存在,如果存在,则调用next向框架报告“error”。每个异步操作都必须是这样的。试想一下,如果在这个查询之后还有一个查询,需要进行嵌套和err判断。每一个处理函数都是如此,这也是异步编程的烦恼之一:很难进行统一的异常处理,处理代码总是需要分散在各处。一不小心就会变成“野外异常”,很难排查。

我只是Jscexed ToDo 网站。首先,启用MySQL 查询以访问Jscex (libjscex.mysql.js):

alt">exports.jscexify = function (db) {  
  •     db.queryAsync = function () {  
  •         var _this = this;  
  •  
  •         var args = [];  
  •         for (var i = 0; i < arguments.length; i++) {  
  •             args.push(arguments[i]);  
  •         }  
  •  
  •         var delegate = {  
  •             onStart: function (callback) {  
  •  
  •                 args.push(function (err, result) {  
  •                     if (err) {  
  •                         callback("failure", err);  
  •                     } else {  
  •                         callback("success", result);  
  •                     }  
  •                 });  
  •  
  •                 _this.query.apply(_this, args);  
  •             }  
  •         };  
  •  
  •         return new Jscex.Async.Task(delegate);  
  •     }  
  • 一般来说,将一个异步接口给Jscex化并不需要那么多代码(最关键的其实只是onStart函数)。这里近30行代码,其中大部分是为了支持“变长”参数,因此queryAsync函数会保留调用时的所有参数,补上一个callback,再去调用query函数本身。此时,便可以去改写之前的index等处理函数了(controllerstodo.js),例如:

    1. exports.index = toHandler(eval(Jscex.compile("async"function (req, res) {  
    2.  
    3.     var todos = $await(db.queryAsync('select * from todo order by finished asc, id asc limit 50'));  
    4.     res.render("index", { todos: todos });  
    5.  
    6. }))); 

    toHandler函数的作用,是将一个“接受req和res,返回Task”的函数,封装成标准的“接受req、res和next三个参数”的处理函数,并提供统一的错误处理:

    1. var toHandler = function (asyncFunc) {  
    2.     return function (req, res, next) {  
    3.         var task = asyncFunc(req, res);  
    4.         task.addListener(function () {  
    5.             if (task.status == "failed") {  
    6.                 next(task.error);  
    7.             }  
    8.         });  
    9.         task.start();  
    10.     }  

    我在todo.js里保留了原有各个处理函数的实现,感兴趣的朋友可以对比一下它们之前的差别。可惜的是,由于ToDo实在过于简单,Jscex的优势并没有表现出来太多。例如,每个处理程序中只有一个MySQL查询,没有判断和循环,更别说为了充分利用IO并发能力,从而组合多个异步函数了。因此,我最近也一直在寻找更复杂一些的示例,不过似乎用Express的开源网站并不多见,我几乎都想自己写一个了。目前感觉Nodepad似乎还算不错,接下来可能会对它下手。

    ToDo网站依赖Express,ejs和MySQL驱动,同时我把Jscex作为添加为它的子模块。如果您要克隆一份ToDo的代码把玩一番,可以:

    1. > git clone git://github.com/JeffreyZhao/todo.git  
    2. > cd todo  
    3. > git submodule init  
    4. > git submodule update  
    5. > npm install express ejs mysql  
    6. > node server.js 

    从现在开始,我会在InfoQ中文站上发表一系列关于Jscex的文章,既有关于浏览器端的JavaScript开发,也有在服务器端利用Node.js开发的内容。可能您目前还可能会有所疑惑,例如为什么要使用危险的eval函数,eval和Jscex.compile函数不能封装起来吗?其实在看了我的文章并对Jscex有了基本了解之后,就会发现这些都是以“传统眼光”来看待Jscex时所形成的误解。Jscex的做法的确“另辟蹊径”,否则在JavaScript异步类库已经多如牛毛的情况下,我不知如何让它脱颖而出。(高端网站建设)

    我们专注高端建站,小程序开发、软件系统定制开发、BUG修复、物联网开发、各类API接口对接开发等。十余年开发经验,每一个项目承诺做到满意为止,多一次对比,一定让您多一份收获!

    本文章出于推来客官网,转载请表明原文地址:https://www.tlkjt.com/web/13823.html

    在线客服

    扫码联系客服

    3985758

    回到顶部