27
18911184380
當前位置:首頁 > 資訊 > 建站知識

[北(běi)京網站制作]基于Node.js、Express和(hé)Jscex開發的(de)ToDo網站示例

2011-10-24 酷站科技 大(dà)

根據Node.js、Express和(hé)Jscex開發設計的(de)ToDo網址實例

Jscex的(de)關鍵應用(yòng)情景是“JavaScript異步編程”,但是并沒有限定是跑在電腦(nǎo)浏覽器還是服務端。近期Node.js很火爆,也(yě)剛公布了(le)原生态的(de)Windows版,許多(duō)老同學聚會用(yòng)它來(lái)做(zuò)一些網址那樣的(de)微信小程序。現階段用(yòng)Node.js開發網站最知名的(de)架構是Express,應用(yòng)起來也(yě)是較爲非常容易的(de)。前不久見到CNodeJS小區(qū)的(de)一篇文章(zhāng),有同學們将一個(gè)Python寫的(de)ToDo目錄網址移殖來(lái)到Node.js上,我爲了(le)更好地營銷推廣Jscex,就fork了(le)這(zhè)一新項目,将其改動爲根據Jscex的(de)版本号,大(dà)家能夠 來(lái)較爲一下(xià)。自然這(zhè)一網址過度簡易,因爲我已經找尋更适合的(de)新項目。(網站制作)

51CTO強烈推薦專題講座:Node.js會員(yuán)專區(qū)

JavaScript是一個(gè)沒有堵塞特點的(de)語言,因而各種API都是會設計方案爲多(duō)線程,這(zhè)針對(duì)網絡服務器的(de)彈性和(hé)手機客戶端網頁頁面的(de)回應工作能力都是有益處,但是在程序流程撰寫上便會碰到各種各樣難題了(le)。比如在ToDo實例中的(de)一個(gè)簡易的(de)處理(lǐ)函數,由于必須數據庫查詢,就需要寫出帶到調的(de)模樣:

  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自變量用(yòng)于實際操作MySQL數據庫查詢,它的(de)query方式 傳到sql(很有可(kě)能還(hái)會繼續有主要參數)并出示一個(gè)回調函數,用(yòng)于提醒不正确或者回到查尋結果。在回調函數中大(dà)家務必分(fēn)辨err是不是存有,假如存有便啓用(yòng)next彙報架構“出錯了(le)”。每一個(gè)多(duō)線程實際操作都務必這(zhè)般,設想假如在這(zhè)個(gè)查尋後也(yě)有另一個(gè)查尋,則還(hái)必須開展一次嵌套循環和(hé)err分(fēn)辨。每一個(gè)處理(lǐ)函數全是這(zhè)般,這(zhè)也(yě)是異步編程的(de)苦惱之一:無法開展統一的(de)錯誤處理(lǐ),解決編碼一直必須分(fēn)散化(huà)在各部,一不小心就變爲“野出現異常”,還(hái)難以清查出去。

我将ToDo網址簡易地Jscex化(huà)了(le)一下(xià)。最先讓MySQL的(de)查尋可(kě)以連接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.   &n bsp;         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.     }  

一般來(lái)說,将一個(gè)多(duō)線程插口給Jscex化(huà)并不一定那麽多(duō)編碼(最重要的(de)實際上僅僅onStart涵數)。這(zhè)兒(ér)近30行編碼,在其中絕大(dà)多(duō)數是爲了(le)更好地适用(yòng)“拉長(cháng)”主要參數,因而queryAsync涵數會保存啓用(yòng)時(shí)的(de)全部主要參數,補上一個(gè)callback,再去啓用(yòng)query涵數自身。這(zhè)時(shí),便能夠 去改變以前的(de)index等處理(lǐ)函數了(le)(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. })));&n bsp;

toHandler涵數的(de)功效,是将一個(gè)“接納req和(hé)res,回到Task”的(de)涵數,封裝成規範的(de)“接納req、res和(hé)next三個(gè)主要參數”的(de)處理(lǐ)函數,并出示統一的(de)處理(lǐ)錯誤:

  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.     }  

我還(hái)在todo.js裏保存了(le)原來(lái)每個(gè)處理(lǐ)函數的(de)完成,很感興趣的(de)盆友能夠 比照(zhào)一下(xià)他(tā)們以前的(de)區(qū)别。遺憾的(de)是,因爲ToDo确實過度簡易,Jscex的(de)優點并沒有主要表現出去過多(duō)。比如,每一個(gè)程序處理(lǐ)中隻有一個(gè)MySQL查尋,沒有分(fēn)辨和(hé)循環系統,更不要說爲了(le)更好地靈活運用(yòng)IO高(gāo)并發工作能力,進而組成好幾個(gè)多(duō)線程涵數了(le)。因而,我近期也(yě)一直在找尋更繁雜(zá)一些的(de)實例,但是好像用(yòng)Express的(de)開源網站并不常見,我基本上都想自身寫一個(gè)了(le)。現階段覺得(de)Nodepad好像還(hái)算(suàn)非常好,接下(xià)去很有可(kě)能會對(duì)它著(zhe)手。

ToDo網址依靠Express,ejs和(hé)MySQL驅動器,另外我将Jscex做(zuò)爲加上爲它的(de)子控制模塊。假如您要複制一份ToDo的(de)編碼盤玩一番,能夠 :

  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的(de)文章(zhāng)内容,不僅有有關電腦(nǎo)浏覽器端JavaScript開發設計,也(yě)是有在服務端運用(yòng)Node.js開發設計的(de)內容。很有可(kě)能您現階段還(hái)很有可(kě)能會有一定的(de)疑慮,比如爲何要應用(yòng)風險的(de)eval涵數,eval和(hé)Jscex.compile涵數不可(kě)以封裝起來嗎?實際上在看過我的(de)文章(zhāng)内容并對(duì)Jscex擁有基礎掌握以後,便會發覺這(zhè)種全是以“傳統式目光(guāng)”來(lái)對(duì)待Jscex時(shí)需産生的(de)誤會。Jscex的(de)作法确實“獨辟蹊徑”,不然在JavaScript多(duō)線程類庫早已比比皆是的(de)狀況下(xià),我不知怎麽讓它出類拔萃。(高(gāo)檔網站建設)

來(lái)源于申明(míng):以上内容一部分(fēn)(包括照(zhào)片、文本)來(lái)自互聯網,若有侵權行爲,請立即與本網站聯絡(010-57218159)。
如沒特殊注明(míng),文章(zhāng)均爲酷站科技原創,轉載請注明(míng)來(lái)自49841.html
聯系專業的(de)商務顧問,制定方案,專業設計,一對(duì)一咨詢及其報價詳情
服務熱(rè)線服務熱(rè)線 18911184380
聯系我們 contact us
18911184380
18911184380 — 海澱營業部
18911184380— 昌平營業部
+

酷站科技爲你提供上門/網站策略方案

留下(xià)聯系方式,我們将會在一個(gè)工作日内與你聯系

隐私條款信息保護中,請放心填寫