EMC易倍体育官方

Web Design
Mobile Internet
Brand Design
Innovative
News
Encyclopedias

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

Date:2011-10-24 Aource:EMC易倍体育官方中国 Type:网站百科
Word Size:small  medium  big

基于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 * from todo order by finished asc, id asc limit 50'function (err, rows) {  
  3.         if (err) return next(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.  
  5.         var args = [];  
  6.         for (var i = 0; i < arguments.length; i++) {  
  7.             args.push(arguments[i]);  
  8.         }  
  9.  
  10.         var delegate = {  
  11.             onStart: function (callback) {  
  12.  
  13.                 args.push(function (err, result) {  
  14.                     if (err) {  
  15.                         callback("failure", err);  
  16.                     } else {  
  17.                         callback("success", result);  
  18.                     }  
  19.                 });  
  20.  
  21.                 _this.query.apply(_this, args);  
  22.             }  
  23.         };  
  24.  
  25.         return new Jscex.Async.Task(delegate);  
  26.     }  

一般来说,将一个异步接口给Jscex化并不需要那么多代码(最关键的其实只是onStart函数)。这里近30行代码,其中大部分是为了支持“变长”参数,因此queryAsync函数会保留调用时的所有参数,补上一个callback,再去调用query函数本身。此时,便可以去改写之前的index等处理函数了(controllerstodo.js),例如:

  1. exports.index = toHandler(



Please contact our consultant

+86 10-60259772

Please provide your contact number. The project manager of shangpin China will contact you as soon as possible.

document.write("") EMC易倍体育官方 中欧(综合)体育 中欧体育网页版 台北外送茶 zoty中欧体育官方网站 中欧体育