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

三步法解析Express源碼

開發(fā) 后端
在抖音上有幸看到一個程序員講述如何閱讀源代碼,主要分為三步:領(lǐng)悟思想、把握設(shè)計、體會細(xì)節(jié)。

 [[349860]]

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

領(lǐng)悟思想:只需體會作者設(shè)計框架的初衷和目的

把握設(shè)計:只需體會代碼的接口和抽象類以及宏觀的設(shè)計

體會細(xì)節(jié):是基于頂層的抽象接口設(shè)計,逐漸展開代碼的畫卷

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

一、領(lǐng)悟思想

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

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

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

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

二、把握設(shè)計

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

2.1 源碼目錄

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

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

2.2 抽象接口

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

 

2.3 設(shè)計原理

這一部分是整個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); 

Application

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

Router

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

Layer

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

Route

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

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

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

對相應(yīng)的地址進(jìn)行監(jiān)聽,等待請求到達(dá)。

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

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

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

三、體會細(xì)節(jié)

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


 

 

3.1 初始化階段

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

 

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

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

在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實例的唯一性。

調(diào)用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. }; 

將該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 請求處理階段

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

 

app.listen()使服務(wù)進(jìn)入監(jiān)聽狀態(tài)(實質(zhì)上是調(diào)用了http模塊)

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

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

  1. app.handle = function handle(req, res, callback) { 
  2.   var router = this._router; 
  3.   // 如果路由系統(tǒng)中處理不了這個請求,就調(diào)用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. }; 

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

  1. router.prototype.handle = function handle(req, res, out) { 
  2.   // 這個地方參數(shù)out就是done,當(dāng)所有都匹配不到,就從路由系統(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. }; 

layer.handle_request()會調(diào)用route.dispatch()觸發(fā)route中內(nèi)容的執(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. }; 

route中的通過判斷請求的方法和route中l(wèi)ayer的方法是否匹配,匹配的話則執(zhí)行相應(yīng)函數(shù),若所有route中的layer都不匹配,則調(diào)到外層的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方法是用戶調(diào)用的next,如果調(diào)用next會執(zhí)行內(nèi)層的next方法,如果沒有匹配到會調(diào)用外層的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.     // 如果當(dāng)前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. }; 

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

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

本文轉(zhuǎn)載自微信公眾號「執(zhí)鳶者」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系執(zhí)鳶者公眾號。

 

責(zé)任編輯:武曉燕 來源: 執(zhí)鳶者
相關(guān)推薦

2021-09-04 23:26:26

源碼ExpressNode

2021-09-04 23:27:58

Axios源碼流程

2010-11-22 10:57:57

職場

2019-10-24 10:00:13

歸類分組分解問題代碼

2022-11-02 13:16:58

數(shù)據(jù)分析

2025-09-12 07:00:00

網(wǎng)絡(luò)攻擊數(shù)據(jù)管理AI系統(tǒng)

2022-05-10 11:31:44

經(jīng)營分析財務(wù)指標(biāo)

2024-05-06 13:15:45

2025-03-10 00:28:00

2021-03-02 07:02:45

Linux操作系統(tǒng)

2023-09-26 12:32:21

數(shù)據(jù)分析領(lǐng)導(dǎo)數(shù)據(jù)

2012-10-31 09:31:06

SSD使用壽命固態(tài)存儲

2020-11-04 00:00:29

Kerberos協(xié)議身份

2011-07-13 09:54:22

VMware故障vSphere

2009-02-04 09:45:05

Java SocketSocket APIJava編程

2012-08-08 17:05:36

App運營

2011-06-28 11:03:55

郵件歸檔

2012-12-24 09:49:24

產(chǎn)品經(jīng)理產(chǎn)品設(shè)計

2022-05-21 23:56:16

Python庫搜索Python

2009-10-12 13:41:00

RHEL 內(nèi)核
點贊
收藏

51CTO技術(shù)棧公眾號

欧美三级中文字| 国产欧美视频一区二区三区| 欧美激情综合色| 日韩 中文字幕| 午夜无码国产理论在线| 国产精品国产三级国产有无不卡| 91在线视频九色| 粉嫩aⅴ一区二区三区| 欧美日韩伦理| 日韩天堂在线观看| 欧美成人免费高清视频| 18网站在线观看| 久久久久久免费网| 亚洲影院色无极综合| 欧美一区二区三区网站| 欧美69视频| 在线视频欧美日韩精品| 日本三级日本三级日本三级极| 黄色精品视频| 午夜欧美视频在线观看| 综合视频在线观看| 麻豆导航在线观看| 成人国产亚洲欧美成人综合网| 国产成人一区二区三区电影| 国产亚洲精品久久久久久打不开 | 免费污网站在线观看| 亚洲图色一区二区三区| 欧美亚洲综合一区| 日韩免费一级视频| 亚洲卡一卡二| 国产精品每日更新| 欧美一区二区三区四区夜夜大片| 国产手机精品视频| 蜜桃视频第一区免费观看| 久久久久在线观看| 外国一级黄色片| 色999日韩| 国产一区二区免费| 精品无码一区二区三区| 久久综合社区| 精品欧美乱码久久久久久1区2区| 8x8x成人免费视频| a级黄色一级片| 国产成人亚洲精品自产在线| 亚洲成人国产| 色偷偷88888欧美精品久久久| 少妇精品一区二区三区| 国产伦精品一区二区三区在线播放 | 激情六月婷婷久久| 国产精品美女主播在线观看纯欲| 亚洲黄色小说图片| 99国产精品视频免费观看一公开 | 五月天色一区| 久久电影中文字幕| 久久久亚洲高清| 欧美国产综合视频| 六十路在线观看| 99久久精品免费看| 精品免费视频123区| 免费看国产片在线观看| 成人动漫精品一区二区| 国产三级精品在线不卡| 熟妇人妻系列aⅴ无码专区友真希| 国产成人精品免费| 国产伦精品一区二区三区视频黑人| www.色婷婷.com| 成人性生交大片免费看视频在线| 国产精品久久久久免费| 色呦呦中文字幕| 91免费版在线看| 日韩精品国内| 91.xxx.高清在线| 亚洲视频网在线直播| 精品一区二区三区毛片| 激情在线视频播放| 亚洲国产人成综合网站| 69堂免费视频| 色成人免费网站| 69av一区二区三区| 制服.丝袜.亚洲.中文.综合懂| 9l视频自拍九色9l视频成人| 亚洲国产高清高潮精品美女| 国产熟妇搡bbbb搡bbbb| 欧美国产一级| 九九热最新视频//这里只有精品| 日韩精品视频播放| 久久综合导航| 91色p视频在线| 人妻无码一区二区三区久久99| 26uuu精品一区二区| 一区二区三区在线视频111| 国产网红在线观看| 色综合天天综合| 国产精品久久久久久久99| 色综合久久中文| 日韩日本欧美亚洲| 国产a∨精品一区二区三区仙踪林| 日韩av高清在线观看| 7777精品久久久大香线蕉小说 | 中文字幕亚洲第一| 欧美国产日韩综合| 日韩制服丝袜av| 99国精产品一二二线| 巨骚激情综合| 亚洲精品视频免费看| 99久久久无码国产精品6| 婷婷成人av| 亚洲免费av片| 欧美日韩人妻精品一区二区三区| 日韩高清在线一区| 国产精品美女黄网| 亚洲视频tv| 色综合色狠狠综合色| 手机在线播放av| 日韩激情在线| 国产va免费精品高清在线| 国产成人精品亚洲精品色欲| 国产色产综合产在线视频| 91精品国产91久久久久麻豆 主演| 天天综合91| 伊人久久久久久久久久| 日韩精品一区二区av| 国产一区不卡精品| 亚洲v日韩v欧美v综合| 亚洲一级少妇| 亚洲第一精品夜夜躁人人躁| 久久国产波多野结衣| 日韩黄色在线观看| 久久久久久艹| 123区在线| 日韩欧美中文字幕一区| 三级av在线免费观看| 久久99精品久久久久久| 日韩高清国产一区在线观看| 天堂在线中文网官网| 亚洲精品在线网站| 久久久久久蜜桃| 国产精品一区二区在线播放 | 亚洲视频一区| 91国产在线播放| 免费大片在线观看www| 欧美在线视频不卡| 国产免费一区二区三区网站免费| 一本色道久久综合亚洲精品高清 | 杨幂毛片午夜性生毛片| 日本国产精品| 欧美在线激情网| 四虎影视精品成人| 欧美日韩在线免费| 毛片网站免费观看| 久久激情中文| 欧洲一区二区在线| 日韩中文在线播放| 色多多国产成人永久免费网站| 狠狠躁夜夜躁人人爽视频| 久久精品欧美一区二区三区不卡 | 国产无遮挡又黄又爽又色视频| 波多野结衣亚洲一区| 大荫蒂性生交片| 嗯用力啊快一点好舒服小柔久久| 久久久久久久国产| 少妇人妻精品一区二区三区| 岛国av一区二区| 美女100%无挡| 免费高清在线一区| 在线视频不卡国产| 视频一区中文字幕精品| 午夜精品福利电影| 国产在线网站| 欧美精品色综合| 久操免费在线视频| 91视视频在线观看入口直接观看www | 在线三级中文| 亚洲高清在线观看| 亚洲精品成人在线视频| 国产精品女人毛片| 亚洲一区二区三区四区精品| 亚洲精一区二区三区| 青青成人在线| 国产精品1区在线| 91国产美女视频| 番号集在线观看| 91精品啪在线观看国产60岁| 999在线观看视频| 在线看成人av| 风流少妇一区二区| 亚洲爆乳无码专区| 久久久久久美女精品| 成人永久免费| 香蕉久久免费电影| 欧美成人精品不卡视频在线观看| 三级网站免费观看| 欧美视频一二三区| 国产亚洲精品女人久久久久久| www激情久久| 日本中文字幕在线不卡| 亚洲欧美日韩精品一区二区| 中文字幕一区二区三区在线乱码| 国产精品xxx在线观看| 国产精品青草久久久久福利99| 日韩影视在线| 中文字幕欧美日韩在线| 性一交一乱一色一视频麻豆| 在线观看一区不卡| 福利一区二区三区四区| 国产精品超碰97尤物18| 人妻大战黑人白浆狂泄| 国产精品69久久久久水密桃| 亚洲综合在线网站| 最新亚洲视频| 日本久久高清视频| 欧美在线电影| 精品乱码一区二区三区| 日韩区欧美区| 国产噜噜噜噜噜久久久久久久久| 国产乱码精品一区二三赶尸艳谈| 日韩有码在线电影| 电影av一区| 亚洲精品久久久久国产| 性一交一乱一色一视频麻豆| 欧美喷水一区二区| 999视频在线| 欧美日韩裸体免费视频| 九九久久免费视频| 亚洲四区在线观看| 一区二区黄色片| 国v精品久久久网| 日韩av自拍偷拍| 人人狠狠综合久久亚洲| 久久久久久久久久久久久国产精品| 黄色欧美日韩| 国产在线无码精品| 91精品一区二区三区综合在线爱 | 欧美日韩一二三四| 九九九九九精品| 国产精品极品国产中出| 不卡视频一区二区三区| 亚洲小说春色综合另类电影| 亚洲xxx大片| 中文在线综合| www 成人av com| 亚洲精品国产九九九| 99久re热视频这里只有精品6| 久久三级中文| 97中文在线| 北条麻妃在线一区二区免费播放| www.久久艹| 免费观看成人www动漫视频| 国产精品视频一区二区三区经| 亚洲免费一区三区| av在线亚洲男人的天堂| 福利电影一区| 久久久com| 精品av一区二区| 日韩av电影在线观看| 成人嫩草影院| 中文精品一区二区三区| 午夜片欧美伦| 久久av高潮av| 99视频一区| 妺妺窝人体色www在线小说| 亚洲精品视频啊美女在线直播| 国产原创popny丨九色| 亚洲一区黄色| 欧美成人xxxxx| 日韩avvvv在线播放| 日本一二区免费| 国产福利视频一区二区三区| 色悠悠在线视频| 久久久午夜精品理论片中文字幕| 国产激情在线免费观看| 欧美高清在线视频| 看免费黄色录像| 亚洲成人动漫精品| 人人爽人人爽人人片av| 欧美高清视频不卡网| 亚洲精品综合网| 国产丝袜高跟一区| 日本在线观看免费| 久久免费成人精品视频| 欧美特大特白屁股xxxx| 成人免费大片黄在线播放| 另类春色校园亚洲| 日韩免费三级| 欧美日韩亚洲一区| 情侣黄网站免费看| 九九九久久久精品| 99re久久精品国产| 国产精品久久久久久久久免费相片| 69av.com| 色偷偷一区二区三区| 97免费观看视频| 日韩av在线精品| 91精彩视频在线播放| 久久久久久久一区二区三区| 日韩影片中文字幕| 99国产高清| 成人一区而且| 久久99中文字幕| 美女视频网站久久| 亚洲成人av免费在线观看| 国产精品久久久久久久久免费相片| 免费又黄又爽又色的视频| 欧洲在线/亚洲| 黄色美女一级片| 中文字幕精品久久久久| 国产拍在线视频| 成人黄色大片在线免费观看| 欧美丝袜美腿| 91网站在线观看免费| 日韩成人一级大片| 久久人妻少妇嫩草av无码专区| 最新国产の精品合集bt伙计| 久草视频一区二区| 欧美v国产在线一区二区三区| 超碰免费在线观看| 97免费中文视频在线观看| 电影91久久久| 日韩性感在线| 亚洲一区黄色| 天天躁日日躁狠狠躁av| 亚洲三级在线免费| 中文字幕天堂在线| 日韩国产欧美区| free性欧美| 成人动漫视频在线观看完整版| 欧美理论视频| www黄色在线| 26uuu亚洲| 国产精品国产三级国产专区52| 欧美电视剧在线看免费| 黄色网页网址在线免费| 国产精品电影一区| 欧美美女在线观看| 99999精品视频| av电影天堂一区二区在线观看| 久久综合成人网| 日韩欧美卡一卡二| 爆操欧美美女| 91久久精品久久国产性色也91| 久久在线电影| 99久久99精品| 自拍偷拍欧美精品| 91麻豆成人精品国产| 日韩小视频在线观看| 久久亚洲资源中文字| 无遮挡亚洲一区| 久久国产夜色精品鲁鲁99| 国产一二三四视频| 欧美日韩精品一区二区三区四区| 大地资源中文在线观看免费版| 国产精品久久77777| 欧美色女视频| 91精品999| 亚洲欧美精品午睡沙发| 亚洲精品无遮挡| 国精产品一区一区三区有限在线| 大型av综合网站| 可以在线看的av网站| 久久久精品人体av艺术| 波多野结衣一区二区在线| 在线视频一区二区| 日本成人在线网站| 亚洲乱码日产精品bd在线观看| 国产成人精品免费在线| 久久久久久久黄色片| 亚洲天堂久久av| 日本成人一区二区| 成人免费看片'免费看| av成人老司机| 91丝袜一区二区三区| 日韩中文理论片| 韩国三级成人在线| 人人干视频在线| 国产午夜久久久久| 国产精品久久久久毛片| 欧美激情一二三| 久久av超碰| 日本一二区免费| 亚洲成人一区在线| 国产黄色在线| 91视频婷婷| 亚洲欧美日韩国产一区| 久久久久人妻一区精品色| 日韩片之四级片| 欧美亚洲韩国| 大地资源第二页在线观看高清版| 成人综合婷婷国产精品久久| 无码aⅴ精品一区二区三区| 日韩中文字幕在线观看| 乱亲女h秽乱长久久久| 美女一区二区三区视频| 亚洲午夜免费视频| www.亚洲资源| 国产精品污www一区二区三区| 日韩国产精品久久| 国产一级视频在线播放| 亚洲午夜未满十八勿入免费观看全集 | 国产精品久久久久久久久免费看| 欧美1区2区|