精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊一聊三步法解析Express源碼

開發(fā) 前端
Express是基于Node.js平臺,并且具備快速、極簡的特點,說明其初衷就是為了通過擴展Node的功能來提高開發(fā)效率。

 

在抖音上有幸看到一個程序員講述如何閱讀源代碼,主要分為三步:領悟思想、把握設計、體會細節(jié)。

  • 領悟思想:只需體會作者設計框架的初衷和目的
  • 把握設計:只需體會代碼的接口和抽象類以及宏觀的設計
  • 體會細節(jié):是基于頂層的抽象接口設計,逐漸展開代碼的畫卷

基于上述三步法,迫不及待的拿Express開刀了。本次源碼解析有什么不到位的地方各位讀者可以在下面留言,我們一起交流。

一、領悟思想

在Express中文網上,介紹Express是基于Node.js平臺,快速、開放、極簡的Web開發(fā)框架。在這句話里面可以得到解讀出以下幾點含義:

Express是基于Node.js平臺,并且具備快速、極簡的特點,說明其初衷就是為了通過擴展Node的功能來提高開發(fā)效率。

開放的特點說明該框架不會對開發(fā)者過多的限制,可以自由的發(fā)揮想象進行功能的擴展。

Express是Web開發(fā)框架,說明作者的定位就是為了更加方便的幫助我們處理HTTP的請求和響應。

二、把握設計

理解了作者設計的思想,下面從源碼目錄、核心設計原理及抽象接口三個層面來對Express進行整體的把握。

2.1 源碼目錄

如下所示是Express的源碼目錄,相比較來說還是比較簡單的。

  1. ├─application.js---創(chuàng)建Express應用后可直接調用的api均在此處(核心) 
  2. ├─express.js---入口文件,創(chuàng)建一個Express應用 
  3. ├─request.js---豐富了http中request實例上的功能 
  4. ├─response.js---豐富了http中response實例上的功能 
  5. ├─utils.js---工具函數(shù) 
  6. ├─view.js---與模板渲染相關的內容 
  7. ├─router---與路由相關的內容(核心) 
  8. | ├─index.js 
  9. | ├─layer.js 
  10. | └route.js 
  11. ├─middleware---與中間件相關的內容 
  12. | ├─init.js---會將新增加在request和response新增加的功能掛載到原始請求的request和response的原型上 
  13. | └query.js---將請求url中的query部分添加到request的query屬性上 

2.2 抽象接口

對源碼的目錄結構有了一定了解,下面利用UML類圖對該系統(tǒng)各個模塊的依賴關系進一步了解,為后續(xù)源碼分析打好基礎。

2.3 設計原理

這一部分是整個Express框架的核心,下圖是整個框架的運行流程,一看是不是很懵逼,為了搞清楚這一部分,需要明確四個概念:Application、Router、Layer、Route。

為了明確上述四個概念,先引入一段代碼

  1. const express = require('./express'); 
  2. const res = require('./response'); 
  3. const app = express(); 
  4. app.get('/test1', (req, res, next) => { 
  5.     console.log('one'); 
  6.     next(); 
  7. }, (req, res) => { 
  8.     console.log('two'); 
  9.     res.end('two'); 
  10. }) 
  11. app.get('/test2', (req, res, next) => { 
  12.     console.log('three'); 
  13.     next(); 
  14. }, (req, res) => { 
  15.     console.log('four'); 
  16.     res.end('four'); 
  17. }) 
  18. app.listen(3000); 

1.Application

表示一個Express應用,通過express()即可進行創(chuàng)建。

2.Router

路由系統(tǒng),用于調度整個系統(tǒng)的運行,在上述代碼中該路由系統(tǒng)包含app.get('/test1',……)和app.get('/test2',……)兩大部分

3.Layer

代表一層,對于上述代碼中app.get('/test1',……)和app.get('/test2',……)都可以成為一個Layer

4.Route

一個Layer中會有多個處理函數(shù)的情況,這多個處理函數(shù)構成了Route,而Route中的每一個函數(shù)又成為Route中的Layer。對于上述代碼中,app.get('/test1',……)中的兩個函數(shù)構成一個Route,每個函數(shù)又是Route中的Layer。

了解完上述概念后,結合該幅圖,就大概能對整個流程有了直觀感受。首先啟動服務,然后客戶端發(fā)起了http://localhost:3000/test2的請求,該過程應該如何運行呢?

啟動服務時會依次執(zhí)行程序,將該路由系統(tǒng)中的路徑、請求方法、處理函數(shù)進行存儲(這些信息根據(jù)一定結構存儲在Router、Layer和Route中)

對相應的地址進行監(jiān)聽,等待請求到達。

請求到達,首先根據(jù)請求的path去從上到下進行匹配,路徑匹配正確則進入該Layer,否則跳出該Layer。

若匹配到該Layer,則進行請求方式的匹配,若匹配方式匹配正確,則執(zhí)行該對應Route中的函數(shù)。

上述解釋的比較簡單,后續(xù)會在細節(jié)部分進一步闡述。

三、體會細節(jié)

通過上述對Express設計原理的分析,下面將從兩個方面做進一步的源碼解讀,下面流程圖是一個常見的Express項目的過程,首先會進行app實例初始化、然后調用一系列中間件,最后建立監(jiān)聽。對于整個工程的運行來說,主要分為兩個階段:初始化階段、請求處理階段,下面將以app.get()為例來闡述一下該核心細節(jié)。

3.1 初始化階段

下面利用app.get()這個路由來了解一下工程的初始化階段。

1.首先來看一下app.get()的內容(源代碼中app.get()是通過遍歷methods的方式產生)

  1. app.get = function(path){ 
  2.     // …… 
  3.     this.lazyrouter(); 
  4.  
  5.     var route = this._router.route(path); 
  6.     route.get.apply(route, slice.call(arguments, 1)); 
  7.     return this; 
  8. }; 

2.在app.lazyrouter()會完成router的實例化過程

  1. app.lazyrouter = function lazyrouter() { 
  2.   if (!this._router) { 
  3.     this._router = new Router({ 
  4.       caseSensitive: this.enabled('case sensitive routing'), 
  5.       strict: this.enabled('strict routing'
  6.     }); 
  7.  
  8.     // 此處會使用一些中間件 
  9.     this._router.use(query(this.get('query parser fn'))); 
  10.     this._router.use(middleware.init(this)); 
  11.   } 
  12. }; 

注意:該過程中其實是利用了單例模式,保證整個過程中獲取router實例的唯一性。

3.調用router.route()方法完成layer的實例化、處理及保存,并返回實例化后的route。(注意源碼中是proto.route)

  1. router.prototype.route = function route(path) { 
  2.   var route = new Route(path); 
  3.   var layer = new Layer(path, { 
  4.     sensitive: this.caseSensitive, 
  5.     strict: this.strict, 
  6.     endtrue 
  7.   }, route.dispatch.bind(route)); 
  8.  
  9.   layer.route = route;// 把route放到layer上 
  10.  
  11.   this.stack.push(layer); // 把layer放到數(shù)組中 
  12.   return route; 
  13. }; 

4.將該app.get()中的函數(shù)存儲到route的stack中。(注意源碼中也是通過遍歷method的方式將get掛載到route的prototype上)

  1. Route.prototype.get = function(){ 
  2.     var handles = flatten(slice.call(arguments)); 
  3.  
  4.     for (var i = 0; i < handles.length; i++) { 
  5.       var handle = handles[i]; 
  6.       // …… 
  7.       // 給route添加layer,這個層中需要存放方法名和handler 
  8.       var layer = Layer('/', {}, handle); 
  9.       layer.method = method; 
  10.  
  11.       this.methods[method] = true
  12.       this.stack.push(layer); 
  13.     } 
  14.  
  15.     return this; 
  16.   }; 

注意:上述代碼均刪除了源碼中一些異常判斷邏輯,方便讀者看清整體框架。

通過上述的分析,可以看出初始化階段主要做了兩件事情:

將路由處理方式(app.get()、app.post()……)、app.use()等劃分為路由系統(tǒng)中的一個Layer。

對于每一個層中的處理函數(shù)全部存儲至Route對象中,一個Route對象與一個Layer相互映射。

3.2 請求處理階段

當服務啟動后即進入監(jiān)聽狀態(tài),等待請求到達后進行處理。

1.app.listen()使服務進入監(jiān)聽狀態(tài)(實質上是調用了http模塊)

  1. app.listen = function listen() { 
  2.   var server = http.createServer(this); 
  3.   return server.listen.apply(server, arguments); 
  4. }; 

2.當連接建立會調用app實例,app實例中會立即執(zhí)行app.handle()函數(shù),app.handle()函數(shù)會立即調用路由系統(tǒng)的處理函數(shù)router.handle()

  1. app.handle = function handle(req, res, callback) { 
  2.   var router = this._router; 
  3.   // 如果路由系統(tǒng)中處理不了這個請求,就調用done方法 
  4.   var done = callback || finalhandler(req, res, { 
  5.     env: this.get('env'), 
  6.     onerror: logerror.bind(this) 
  7.   }); 
  8.   //…… 
  9.   router.handle(req, res, done); 
  10. }; 

3.router.handle()主要是根據(jù)路徑獲取是否有匹配的layer,當匹配到之后則調用layer.prototype.handle_request()去執(zhí)行route中內容的處理

  1. router.prototype.handle = function handle(req, res, out) { 
  2.   // 這個地方參數(shù)out就是done,當所有都匹配不到,就從路由系統(tǒng)中出來,名字很形象 
  3.   var self = this; 
  4.   // …… 
  5.   var stack = self.stack; 
  6.    
  7.   // …… 
  8.  
  9.   next(); 
  10.  
  11.   function next(err) { 
  12.     // …… 
  13.     // get pathname of request 
  14.     var path = getPathname(req); 
  15.  
  16.     // find next matching layer 
  17.     var layer; 
  18.     var match; 
  19.     var route; 
  20.  
  21.     while (match !== true && idx < stack.length) { 
  22.       layer = stack[idx++]; 
  23.       match = matchLayer(layer, path); 
  24.       route = layer.route; 
  25.       // …… 
  26.     } 
  27.  
  28.     // no match 
  29.     if (match !== true) { 
  30.       return done(layerError); 
  31.     } 
  32.     // …… 
  33.  
  34.     // Capture one-time layer values 
  35.     req.params = self.mergeParams 
  36.       ? mergeParams(layer.params, parentParams) 
  37.       : layer.params; 
  38.     var layerPath = layer.path; 
  39.  
  40.     // this should be done for the layer 
  41.     self.process_params(layer, paramcalled, req, res, function (err) { 
  42.       if (err) { 
  43.         return next(layerError || err); 
  44.       } 
  45.  
  46.       if (route) { 
  47.         return layer.handle_request(req, res, next); 
  48.       } 
  49.  
  50.       trim_prefix(layer, layerError, layerPath, path); 
  51.     }); 
  52.   } 
  53.  
  54.   function trim_prefix(layer, layerError, layerPath, path) { 
  55.     // …… 
  56.  
  57.     if (layerError) { 
  58.       layer.handle_error(layerError, req, res, next); 
  59.     } else { 
  60.       layer.handle_request(req, res, next); 
  61.     } 
  62.   } 
  63. }; 

4.layer.handle_request()會調用route.dispatch()觸發(fā)route中內容的執(zhí)行

  1. Layer.prototype.handle_request = function handle(req, res, next) { 
  2.   var fn = this.handle; 
  3.  
  4.   if (fn.length > 3) { 
  5.     // not a standard request handler 
  6.     return next(); 
  7.   } 
  8.  
  9.   try { 
  10.     fn(req, res, next); 
  11.   } catch (err) { 
  12.     next(err); 
  13.   } 
  14. }; 

5.route中的通過判斷請求的方法和route中l(wèi)ayer的方法是否匹配,匹配的話則執(zhí)行相應函數(shù),若所有route中的layer都不匹配,則調到外層的layer中繼續(xù)執(zhí)行。

  1. Route.prototype.dispatch = function dispatch(req, res, done) { 
  2.   var idx = 0; 
  3.   var stack = this.stack; 
  4.   if (stack.length === 0) { 
  5.     return done(); 
  6.   } 
  7.  
  8.   var method = req.method.toLowerCase(); 
  9.   // …… 
  10.      
  11.   next(); 
  12.   // 此next方法是用戶調用的next,如果調用next會執(zhí)行內層的next方法,如果沒有匹配到會調用外層的next方法 
  13.   function next(err) { 
  14.     // …… 
  15.  
  16.     var layer = stack[idx++]; 
  17.     if (!layer) { 
  18.       return done(err); 
  19.     } 
  20.  
  21.     if (layer.method && layer.method !== method) { 
  22.       return next(err); 
  23.     } 
  24.  
  25.     // 如果當前route中的layer的方法匹配到了,執(zhí)行此layer上的handler 
  26.     if (err) { 
  27.       layer.handle_error(err, req, res, next); 
  28.     } else { 
  29.       layer.handle_request(req, res, next); 
  30.     } 
  31.   } 
  32. }; 

通過上述的分析,可以看出初始化階段主要做了兩件事情:

  • 首先判斷l(xiāng)ayer中的path和請求的path是否一致,一致則會進入route進行處理,否則調到下一層layer
  • 在route中會判斷route中的layer與請求方法是否一致,一致的話則函數(shù)執(zhí)行,否則不執(zhí)行,所有route中的layer執(zhí)行完后跳到下層的layer進行執(zhí)行。

 

責任編輯:武曉燕 來源: 前端點線面
相關推薦

2020-11-02 10:51:17

Express源碼Web

2021-09-04 23:27:58

Axios源碼流程

2010-11-22 10:57:57

職場

2021-02-22 14:04:47

Vue框架項目

2021-11-24 22:47:07

Docker開發(fā)容器

2019-10-24 10:00:13

歸類分組分解問題代碼

2020-09-15 12:45:48

系統(tǒng)LinuxUnix

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-09-22 17:36:37

2018-06-07 13:17:12

契約測試單元測試API測試

2022-09-19 16:24:33

數(shù)據(jù)可視化Matplotlib工具

2021-05-12 18:02:23

方法創(chuàng)建線程

2022-09-26 08:03:25

VMware虛擬機

2023-07-06 13:56:14

微軟Skype

2021-02-06 08:34:49

函數(shù)memoize文檔

2021-01-29 08:32:21

數(shù)據(jù)結構數(shù)組

2022-11-01 08:46:20

責任鏈模式對象

2022-08-08 08:25:21

Javajar 文件

2021-08-04 09:32:05

Typescript 技巧Partial
點贊
收藏

51CTO技術棧公眾號

国产中文一区二区三区| 亚洲尤物av| 亚洲国产乱码最新视频 | 成人免费视频播放| 国产成人久久久精品一区| 蜜桃av.com| av自拍一区| 狠狠躁夜夜躁人人爽天天天天97 | 三区四区在线视频| 成人综合婷婷国产精品久久| 国产经典一区二区| 国产一级片久久| 成人av二区| 亚洲精品电影久久久| 亚洲精品综合在线观看| 免费看男女www网站入口在线 | 国产乡下妇女做爰视频| 欧美日韩伦理| 亚洲精品二三区| 日韩av加勒比| 8av国产精品爽爽ⅴa在线观看| 亚洲精品乱码久久久久久久久 | 精品人妻一区二区免费| 欧美成人aaa| 一本一本大道香蕉久在线精品| 蜜臀av.com| 888av在线| 久久久久国产一区二区三区四区| 高清日韩一区| 国产绿帽一区二区三区| 日本不卡免费在线视频| 欧美一区二区三区免费观看| 国产在线一二区| 欧美丰满老妇| 中文字幕无线精品亚洲乱码一区 | 欧美日韩色网| 综合自拍亚洲综合图不卡区| 少妇免费毛片久久久久久久久| 无码国产精品高潮久久99| 国产精品亚洲第一| 亚洲在线视频福利| 国产精品人人爽| 久久aⅴ国产欧美74aaa| 国产精品美女www爽爽爽视频| 在线观看免费国产视频| 极品日韩av| 欧美黑人国产人伦爽爽爽| 三级影片在线看| 亚洲午夜精品一区二区国产| 久久精品夜夜夜夜夜久久| 色偷偷男人天堂| 日韩在线第七页| 色偷偷av一区二区三区乱| 国产黄色录像视频| 日韩精品免费| 色av中文字幕一区| 国产wwwwxxxx| 婷婷综合在线| 欧美成人三级视频网站| 婷婷色中文字幕| 国模吧视频一区| 韩国美女主播一区| 亚洲成人资源网| 在线播放精品| 一本色道久久88综合亚洲精品ⅰ| 在哪里可以看毛片| 精品久久久久中文字幕小说| 在线观看成人黄色| 亚洲欧美卡通动漫| 欧美一区影院| 午夜精品99久久免费| 毛片毛片女人毛片毛片| 日本午夜一本久久久综合| 成人国产亚洲精品a区天堂华泰| 国产伦子伦对白视频| 国产ts人妖一区二区| 国产一区二区视频在线免费观看| 日韩精品系列| 国产精品毛片大码女人| 精品嫩模一区二区三区| av男人的天堂在线观看| 色屁屁一区二区| 激情文学亚洲色图| 久久a级毛片毛片免费观看| 亚洲美女在线视频| 青青青视频在线免费观看| 欧美99在线视频观看| 午夜精品一区二区三区在线视频| 黄色污污网站在线观看| 国产一区福利在线| 另类欧美小说| 麻豆传媒视频在线观看| 亚洲成a人v欧美综合天堂| 一区二区在线播放视频| 日韩在线网址| 亚洲午夜精品久久久久久久久久久久 | 日日夜夜精品网站| 亚洲七七久久综合桃花剧情介绍| 欧美性猛交xxxx免费看漫画| 超碰成人在线播放| 欧美理伦片在线播放| 色综合亚洲精品激情狠狠| 久久久久久久久久99| 欧美午夜大胆人体| 色系网站成人免费| 久久久国产精品久久久| 欧美理论视频| 国色天香2019中文字幕在线观看| 在线免费观看视频网站| 99久久精品99国产精品| www.黄色网址.com| 午夜无码国产理论在线| 亚洲成人激情视频| 精品国产视频在线观看| 久久一本综合频道| 国产精品18毛片一区二区| 日本www在线观看视频| 黑人精品xxx一区| 亚洲精品一二三四| 久久精品国产大片免费观看| 欧美影院在线播放| 成人午夜视频一区二区播放| 中文字幕一区二区三区四区| 久久精品网站视频| 性人久久久久| 韩国美女主播一区| 亚洲欧美高清视频| 亚洲美女在线国产| 午夜免费一级片| 成人高清电影网站| 国产99久久久欧美黑人| 天天摸天天干天天操| 一二三区精品视频| 国产在线观看中文字幕| 国产韩日影视精品| 国产一区视频在线播放| 自拍视频在线免费观看| 欧美性极品少妇| 成熟人妻av无码专区| 日韩精品午夜视频| 蜜桃视频在线观看成人| 五月天国产在线| 亚洲精品成人av| 国产成人一区二区三区影院在线| 成人午夜av在线| 欧美视频在线观看视频| 成人性生交大片免费看96| 欧美成人激情图片网| 999久久久久| 一区二区日韩电影| 任你躁av一区二区三区| 影音先锋久久久| 国产一区二区三区无遮挡| 亚洲精品福利电影| 亚洲美女激情视频| 国产亚洲久一区二区| 国产精品美女久久久久久久久久久| 性chinese极品按摩| 我不卡影院28| 国产精品免费观看高清| bbw在线视频| 亚洲欧美国产精品久久久久久久| 国产免费www| 中文字幕一区二区在线观看 | 福利一区二区在线| 国产欧美日韩小视频| 天天久久夜夜| 国产精品色视频| 亚洲羞羞网站| 亚洲精品综合久久中文字幕| 中文字幕在线播| 国产精品国产三级国产| 善良的小姨在线| 99热这里只有精品8| 免费试看一区| gogo大尺度成人免费视频| 欧美大学生性色视频| 日韩三级电影网| 在线不卡的av| 精品小视频在线观看| 久久久久久免费毛片精品| 亚洲小视频网站| 亚洲毛片网站| 视频一区二区三区免费观看| 日韩一区网站| 国产精品com| 黑人玩欧美人三根一起进| 亚洲精品资源在线| 99国产在线播放| 黑人巨大精品欧美一区二区一视频| 欧日韩不卡视频| 成人激情校园春色| 爱爱爱爱免费视频| 日韩天堂av| 欧美与动交zoz0z| 亚洲瘦老头同性70tv| 亚洲一区二区三区sesese| 中文字幕在线直播| 蜜臀久久99精品久久久无需会员| 亚州av在线播放| 日韩一级免费一区| 成人免费一级片| 午夜a成v人精品| 亚洲一级生活片| 91色视频在线| caopor在线| 国精产品一区一区三区mba桃花| 18岁网站在线观看| 亚洲欧美一区在线| 亚洲精品日韩成人| 亚洲尤物av| 国产免费一区| 国产精品777| 色戒汤唯在线| 久久久久久久国产精品视频| 黄网站免费在线观看| 国产亚洲欧洲在线| 日韩精品视频在线观看一区二区三区| 日韩精品一区二区在线观看| 亚洲最大成人在线视频| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩欧美在线视频日韩欧美在线视频| 免费一级全黄少妇性色生活片| 欧美国产一区二区| 亚洲AV无码国产成人久久| 不卡一区二区三区四区| 中文字幕在线播放一区二区| 精品系列免费在线观看| 91精品无人成人www| 三级一区在线视频先锋| 97av视频在线观看| 亚洲日本久久| heyzo亚洲| 亚洲成色精品| 久久久久久久午夜| 国产日韩欧美一区| 久在线观看视频| 国产精品美女久久久浪潮软件| 日韩视频免费播放| 在线精品观看| 欧美爱爱视频免费看| 日韩午夜高潮| jizzjizzxxxx| 久久伊人亚洲| 亚洲视频在线观看一区二区三区| 日韩专区欧美专区| 免费看黄色一级大片| 美女视频一区在线观看| 国产三级精品三级在线| 精品写真视频在线观看| 韩国三级在线播放| 国产一区在线看| 黑人无套内谢中国美女| 韩国三级在线一区| 国产人妖在线观看| 成人黄色网址在线观看| 日本国产在线视频| 久久久影院官网| 久久久久久久毛片| 中文字幕一区不卡| 久久97人妻无码一区二区三区| 亚洲图片自拍偷拍| 潘金莲一级淫片aaaaaa播放| 欧美最猛黑人xxxxx猛交| 一本一道精品欧美中文字幕| 91精品国产品国语在线不卡| 国产小视频免费观看| 日韩成人xxxx| 95在线视频| 欧美人与性动交a欧美精品| 3344国产永久在线观看视频| 国产成人综合亚洲| 四虎视频在线精品免费网址| 9a蜜桃久久久久久免费| 亚洲免费福利一区| 五月天色婷婷综合| 精品1区2区3区4区| 久草综合在线观看| 国产一区二区三区久久悠悠色av| 日本三级日本三级日本三级极| 国产亚洲短视频| 亚洲一级生活片| 日韩欧美中文在线| 999免费视频| 亚洲区免费影片| 伊人福利在线| 国产精品扒开腿做| 亚洲亚洲一区二区三区| 欧美日韩一区二区视频在线| 亚洲国产日韩欧美在线| 免费观看精品视频| 国产一区二区视频在线| 在线 丝袜 欧美 日韩 制服| 亚洲欧美另类小说视频| 综合网在线观看| 日韩免费成人网| 91看片在线观看| 91国产精品视频在线| 996久久国产精品线观看| 欧美 日韩 国产在线| 一区二区三区四区日韩| 玩弄japan白嫩少妇hd| 国产91丝袜在线观看| 久久一级免费视频| 欧美视频专区一二在线观看| 精品乱子伦一区二区| 在线观看日韩www视频免费| 国产传媒av在线| 97影院在线午夜| 日韩精品欧美| 免费在线观看毛片网站| 成人污污视频在线观看| 天天做夜夜爱爱爱| 在线看日本不卡| 天堂中文字幕av| 欧美精品第一页在线播放| 曰本一区二区| 亚洲人成网站在线观看播放| 羞羞答答国产精品www一本| 午夜性福利视频| 亚洲欧美日韩一区二区| 中文字幕男人天堂| 亚洲视频一区二区三区| 日韩av影片| 国外成人免费视频| 伊人久久成人| 精品伦一区二区三区| 亚洲色图视频网站| 亚洲性在线观看| 色偷偷9999www| 国产欧美自拍| 亚洲精品一区国产精品| 日韩高清不卡一区二区| b站大片免费直播| 一本久久a久久精品亚洲 | 国产亚洲日本欧美韩国| 日韩伦理福利| 久久久久久精| 亚洲欧美高清| 精品无码一区二区三区| 欧美性开放视频| 欧美美女色图| 国产精品成熟老女人| 欧美精品尤物在线观看| 九九热在线免费| 中文字幕一区在线| 国产特级黄色片| 欧美激情成人在线视频| 99re热精品视频| 日日碰狠狠添天天爽超碰97| av在线不卡免费看| 日本一区二区三区精品| 亚洲人成伊人成综合网久久久| 亚洲mmav| 亚洲欧美日韩另类精品一区二区三区| 美女尤物国产一区| 国产天堂av在线| 欧美xxxx老人做受| 人狥杂交一区欧美二区| 欧美日韩一区二区三| 久久精品国产秦先生| 国产成人综合在线视频| 欧美成人在线直播| 欧美极品videos大乳护士| 欧美亚洲另类在线一区二区三区 | 在线成人免费av| 亚洲成人精品一区| 黄色国产在线| 91久久国产精品91久久性色| 欧美jjzz| 白丝女仆被免费网站| 欧美日韩不卡一区二区| caoporn免费在线| 久久视频在线观看中文字幕| 欧美aa在线视频| 精品小视频在线观看| 亚洲天堂男人天堂| 午夜久久av| 成人免费xxxxx在线视频| 亚洲欧洲另类国产综合| 三级网站免费观看| 国产精品18久久久久久首页狼| 欧美a级片网站| 一区二区伦理片| 日韩午夜电影在线观看| 惠美惠精品网| 亚洲中文字幕无码一区二区三区| 91论坛在线播放| 99久久久国产精品无码网爆| 欧美亚州一区二区三区| 91精品1区| 人妻av无码一区二区三区| 日韩一级成人av| 国产亚洲一区二区手机在线观看 | 国产大片一区二区| 69xxxx国产| 91精品国产91久久久久福利| 我不卡影院28| 国产精品免费无码| 精品国产一区二区三区忘忧草|