亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Node.js的Koa框架上手及MySQL操作指南

2019-11-20 09:42:35
字體:
來源:轉載
供稿:網友

由 Express 原班人馬打造的 koa,致力于成為一個更小、更健壯、更富有表現力的 Web 框架。使用 koa 編寫 web 應用,通過組合不同的 generator,可以免除重復繁瑣的回調函數嵌套,并極大地提升常用錯誤處理效率。Koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得得心應手。

安裝koa
koa 依賴支持 generator 的 Node 環境,也就是說,node的版本要在 0.11.9 或者更高,否則將無法執行。

用npm:

$ npm install koa

或者,選擇安裝在全局:

$ npm install -g koa

Example
這是一個koa的簡單例子:

var koa = require('koa');var app = koa();// loggerapp.use(function *(next){ var start = new Date; yield next; var ms = new Date - start; console.log('%s %s - %s', this.method, this.url, ms);});// responseapp.use(function *(){ this.body = 'Hello World';});app.listen(3000);

與普通的 function 不同,generator functions 以 function* 聲明。以這種關鍵詞聲明的函數支持 yield。在后面會講到 yield 的用法和意義。

執行koa
執行koa時需要在 ―-harmony 模式下運行,為了方便可以將 node 設置為默認啟動 harmony 模式的別名:

alias node='node --harmony'

這樣在執行相關js的時候就可以直接使用了。

Cascading
這是一個比較抽象的概念。Koa 中間件以一種非常傳統的方式級聯起來,也就是這里所謂的Cascading。

在以往的 Node 開發中,頻繁使用回調不太便于展示復雜的代碼邏輯,在 Koa 中,我們可以寫出真正具有表現力的中間件。與 Connect 實現中間件的方法相對比,Koa 的做法不是簡單的將控制權依次移交給一個又一個的中間件直到程序結束,Koa 執行代碼的方式有點像回形針,用戶請求通過中間件,遇到 yield next 關鍵字時,會被傳遞到下一個符合請求的路由(downstream),在 yield next 捕獲不到下一個中間件時,逆序返回繼續執行代碼(upstream)。

下邊這個例子展現了使用這一特殊方法書寫的 Hello World 范例:一開始,用戶的請求通過 x-response-time 中間件和 logging 中間件,這兩個中間件記錄了一些請求細節,然后「穿過」 response 中間件一次,最終結束請求,返回 「Hello World」。

當程序運行到 yield next 時,代碼流會暫停執行這個中間件的剩余代碼,轉而切換到下一個被定義的中間件執行代碼,這樣切換控制權的方式,被稱為 downstream,當沒有下一個中間件執行 downstream 的時候,代碼將會逆序執行。

var koa = require('koa');var app = koa();// x-response-timeapp.use(function *(next){ // (1) 進入路由 var start = new Date; yield next; // (5) 再次進入 x-response-time 中間件,記錄2次通過此中間件「穿越」的時間 var ms = new Date - start; this.set('X-Response-Time', ms + 'ms'); // (6) 返回 this.body});// loggerapp.use(function *(next){ // (2) 進入 logger 中間件 var start = new Date; yield next; // (4) 再次進入 logger 中間件,記錄2次通過此中間件「穿越」的時間 var ms = new Date - start; console.log('%s %s - %s', this.method, this.url, ms);});// responseapp.use(function *(){ // (3) 進入 response 中間件,沒有捕獲到下一個符合條件的中間件,傳遞到 upstream this.body = 'Hello World';});app.listen(3000);

在上方的范例代碼中,中間件以此被執行的順序已經在注釋中標記出來。你也可以自己嘗試運行一下這個范例,并打印記錄下各個環節的輸出與耗時。

.middleware1 { // (1) do some stuff .middleware2 {  // (2) do some other stuff  .middleware3 {   // (3) NO next yield !   // this.body = 'hello world'  }  // (4) do some other stuff later } // (5) do some stuff lastest and return}

上方的偽代碼中標注了中間件的執行順序,看起來是不是有點像 ruby 執行代碼塊(block)時 yield 的表現了?也許這能幫助你更好的理解 koa 運作的方式。

koa訪問mysql數據庫操作
實現方法一(co-mysql)
mysql庫是以回調形式實現的,而koa中間件要求Promise形式,經過搜索,發現了co-mysql和mysql-co,這兩個庫的思路差不多,mysql-co封裝度更高,并使用速度更快的mysql2,而co-mysql更簡單,只是將mysql.query封裝成Promise形式。下面是基于co-mysql的寫法

var wrapper = require('co-mysql'), mysql = require('mysql');var options = {  host : 'localhost',  port : 3306 ,  database : 'test',  user: 'root',  password : 'rootroot'};var pool = mysql.createPool(options), p = wrapper(pool);... var rows = yield p.query('SELECT 1'); yield this.render('index', {    title: rows[0].fieldName  });...})();

實現方法二(promisify-node)
找到promisify-node庫,可以將庫整體轉化為Promise形式,示例代碼如下:

var promisify = require("promisify-node");var db = promisify("myDbHelper");...var rows = yield db.getById('tableName', {id:1});  yield this.render('index', {    title: rows[0].fieldName  });...

實現方法三(thunkify、thunkify-wrap)

使用thunkify也能夠完成封裝,thunkify-wrap是一個增強版的thunkify,不過看說明,這種方法在未來的發展中可能會被淘汰,大概的使用如下:

var genify = require('thunkify-wrap').genify;var db = genify("myDbHelper");...var rows = yield db.getById('tableName', {id:1});  yield this.render('index', {    title: rows[0].fieldName  });...

實現方法四(直接方法)
直接改造原來express下的代碼為Promise形式,參考了co-mysql,并仔細學習了Promise相關知識,完成了已有代碼的改造,代碼及說明如下:
dbHelper.js

var config = require('./dbconfig');var options = {  'host': config.db_host,  'port': config.db_port,  'database': config.db_name,  'user': config.db_user,  'password': config.db_passwd}var mysql = require('mysql');var pool = mysql.createPool(options);//內部對mysql的封裝,執行sql語句function execQuery(sql, values, callback) {  var errinfo;  pool.getConnection(function(err, connection) {    if (err) {      errinfo = 'DB-獲取數據庫連接異常!';      throw errinfo;    } else {      var querys = connection.query(sql, values, function(err, rows) {        release(connection);        if (err) {          errinfo = 'DB-SQL語句執行錯誤:' + err;          callback(err);        } else {          callback(null,rows);    //注意:第一個參數必須為null        }      });    }  });}function release(connection) {  try {    connection.release(function(error) {      if (error) {        console.log('DB-關閉數據庫連接異常!');      }    });  } catch (err) {}}//對外接口返回Promise函數形式exports.getById = function(tablename, id){  return new Promise(function(resolve, reject){    var values = {id:id};    var sql = 'select * from ?? where ?';    execQuery(sql,[tablename, values], function(err, rows){      if(err){        reject(err);      }else{        resolve(rows);      }    })  });}routes/index.jsvar db = require("../dbHelper");...var rows = yield db.getById('tableName', {id:1});  yield this.render('index', {    title: rows[0].fieldName  });...

代碼
請參考這個項目中的數據庫操作部分,項目處于持續開發中,數據庫示例部分取自該項目。
https://github.com/zhoutk/koadmin.git

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线视频网站| 国自产精品手机在线观看视频| 国产一区二区三区毛片| 国产精品男人爽免费视频1| 97在线视频免费观看| 亚洲最大中文字幕| 久久亚洲国产精品| 亚洲性猛交xxxxwww| 精品久久久久久久久久国产| 中文字幕亚洲无线码在线一区| 波霸ol色综合久久| 成人黄色在线播放| 91久久精品视频| 欧美亚洲第一页| 91中文在线视频| 7777免费精品视频| 久久精品视频99| 欧美尤物巨大精品爽| 国产精品直播网红| 欧美成人h版在线观看| 黄色一区二区在线| 国产成人精品久久二区二区91| 中文字幕在线亚洲| 日韩精品免费观看| 97久久精品在线| 亚洲国产精品高清久久久| 国产丝袜一区二区| 成人乱人伦精品视频在线观看| 亚洲aⅴ男人的天堂在线观看| 国产一区二区视频在线观看| 欧美成人免费在线观看| 欧美麻豆久久久久久中文| 欧美日韩中文字幕| 成人久久18免费网站图片| 国外成人在线播放| 日韩在线视频国产| 欧美老女人bb| 成人精品aaaa网站| 久久亚洲综合国产精品99麻豆精品福利| 日韩专区中文字幕| 欧美日韩在线影院| 国产中文字幕亚洲| 国产亚洲a∨片在线观看| 91禁国产网站| 久久激情视频免费观看| 91久久精品一区| 欧美极品少妇xxxxⅹ免费视频| 美日韩在线视频| 美女视频黄免费的亚洲男人天堂| 日本三级韩国三级久久| 国产剧情日韩欧美| 久久久久久久久久久久久久久久久久av| 亚洲天堂av在线免费| 欧美综合第一页| 精品国偷自产在线| 国产精品成人品| 久久躁狠狠躁夜夜爽| 日韩在线视频观看| 日韩小视频网址| 欧美亚洲成人网| 亚洲国产精彩中文乱码av在线播放| 亚洲精品456在线播放狼人| 欧美一级淫片丝袜脚交| 午夜精品视频在线| 这里只有精品视频在线| 国产精品日日摸夜夜添夜夜av| 日韩美女在线看| 久久综合色影院| 热99精品只有里视频精品| 久久99久久久久久久噜噜| 久久久久女教师免费一区| 欧美精品手机在线| 欧美性猛交xxxx黑人猛交| 久久天天躁狠狠躁夜夜躁| 日本国产一区二区三区| 国产精品美女午夜av| 成人免费网站在线看| 亚洲第一偷拍网| 国产精品热视频| 欧美日韩中文字幕日韩欧美| 高清欧美性猛交xxxx黑人猛交| 欧美激情欧美狂野欧美精品| 亚洲国产精品大全| 亚洲精品动漫100p| 最近的2019中文字幕免费一页| 亚洲视频在线观看网站| 亚洲成**性毛茸茸| 一本一本久久a久久精品综合小说| 国产成人一区三区| 国产一区二区三区在线| 久久97精品久久久久久久不卡| 亚洲激情中文字幕| 日韩影视在线观看| 久久久久久国产免费| 国产精品久久av| 97精品欧美一区二区三区| 久久久精品免费视频| 成人网在线免费观看| 欧美大奶子在线| 欧美国产视频一区二区| 午夜免费在线观看精品视频| 久久夜色精品国产亚洲aⅴ| 欧美人与物videos| 国产精品久久久久久久一区探花| 精品视频在线导航| 91久久精品视频| 亚洲欧美精品中文字幕在线| 91国产精品电影| 久久精品99久久久久久久久| 亚洲国产91精品在线观看| 欧美午夜视频一区二区| 国产精品麻豆va在线播放| 中文字幕欧美精品在线| 国产精品网址在线| 亚洲日韩欧美视频一区| 成人免费自拍视频| 日韩视频免费在线| 992tv在线成人免费观看| 久久亚洲春色中文字幕| 国产精品www网站| 黑人巨大精品欧美一区免费视频| 美日韩精品免费视频| 69av在线视频| 爽爽爽爽爽爽爽成人免费观看| 97国产真实伦对白精彩视频8| 日韩国产中文字幕| 国产ts一区二区| 在线观看欧美成人| 亚洲一区制服诱惑| 欧美日韩福利视频| 欧美一级视频免费在线观看| 777国产偷窥盗摄精品视频| 久久久久九九九九| 91在线高清视频| 色av中文字幕一区| 精品国偷自产在线视频| 欧美精品一区在线播放| 亚洲人成欧美中文字幕| 亚洲精品一区二区久| 日韩av影院在线观看| 欧美精品在线免费观看| 国产精品成人播放| 欧美日韩一区二区三区| 亚洲bt天天射| 国内精品国产三级国产在线专| www欧美日韩| 91伊人影院在线播放| 日韩av一区二区在线| 91在线高清免费观看| 亚洲国产成人91精品| 欧美激情久久久| 亚洲免费人成在线视频观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 在线观看欧美日韩国产| 欧美中文在线视频| 国产亚洲欧美一区| 在线观看精品国产视频| 国产精品av免费在线观看| 日韩国产精品视频| 国产第一区电影| 国模视频一区二区| 欧美日韩国产91| 欧美韩日一区二区| 欧美久久精品一级黑人c片|