日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Express 的使用

發布時間:2024/8/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Express 的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容,基于 Express 4.x 版本

Node.js 的 Express

Express?估計是那種你第一次接觸,就會喜歡上用它的框架。因為它真的非常簡單,直接。

在當前版本上,一共才這么幾個文件:

lib/ ├── application.js ├── express.js ├── middleware │?? ├── init.js │?? └── query.js ├── request.js ├── response.js ├── router │?? ├── index.js │?? ├── layer.js │?? └── route.js ├── utils.js └── view.js

這種程度,說它是一個“框架”可能都有些過了,幾乎都是工具性質的實現,只限于 Web 層。

當然,直接了當地實現了 Web 層的基本功能,是得益于?Node.js?本身的 API 中,就提供了?net?和?http?這兩層,?Express?對?http?的方法包裝一下即可。

不過,本身功能簡單的東西,在?package.json?中卻有好長一串?dependencies?列表。

Hello World

在跑?Express?前,你可能需要初始化一個?npm?項目,然后再使用?npm?安裝?Express:

mkdir p cd p npm init npm install express --save

新建一個?app.js?:

const express = require('express'); const app = express(); app.all('/', (req, res) => res.send('hello') ); app.listen(8888);

調試信息是通過環境變量?DEBUG?控制的:

const process = require('process'); process.env['DEBUG'] = 'express:*';

這樣就可以在終端看到帶顏色的輸出了,嗯,是的,帶顏色控制字符,vim 中直接跑就 SB 了。

應用 Application

Application?是一個上層統籌的概念,整合“請求-響應”流程。?express()?的調用會返回一個?application?,一個項目中,有多個?app?是沒問題的:

const express = require('express');const app = express(); app.all('/', (req, res) => res.send('hello')); app.listen(8888);const app2 = express(); app2.all('/', (req, res) => res.send('hello2')); app2.listen(8889);

多個?app?的另一個用法,是直接把某個?path?映射到整個?app?:

const express = require('express');const app = express();app.all('/', (req, res) => {res.send('ok'); });const app2 = express(); app2.get('/xx', (req, res, next) => res.send('in app2') ) app.use('/2', app2)app.listen(8888);

這樣,當訪問?/2/xx?時,就會看到?in app2?的響應。

前面說了?app?實際上是一個上層調度的角色,在看后面的內容之前,先說一下?Express?的特點,整體上來說,它的結構基本上是“回調函數串行”,無論是?app?,或者?route,?handle,?middleware這些不同的概念,它們的形式,基本是一致的,就是?(res, req, next) => {}?,串行的流程依賴?next()?的顯式調用。

我們把?app?的功能,分成五個部分來說。

路由 - Handler 映射

app.all('/', (req, res, next) => {}); app.get('/', (req, res, next) => {}); app.post('/', (req, res, next) => {}); app.put('/', (req, res, next) => {}); app.delete('/', (req, res, next) => {});

上面的代碼就是基本的幾個方法,路由的匹配是串行的,可以通過?next()?控制:

const express = require('express');const app = express();app.all('/', (req, res, next) => {res.send('1 ');console.log('here');next(); });app.get('/', (req, res, next) => {res.send('2 ');console.log('get');next(); });app.listen(8888);

對于上面的代碼,因為重復調用?send()?會報錯。

同樣的功能,也可以使用?app.route()?來實現:

const express = require('express');const app = express();app.route('/').all( (req, res, next) => {console.log('all');next(); }).get( (req, res, next) => {res.send('get');next(); }).all( (req, res, next) => {console.log('tail');next(); });app.listen(8888);

app.route()?也是一種抽象通用邏輯的形式。

還有一個方法是?app.params?,它把“命名參數”的處理單獨拆出來了(我個人不理解這玩意兒有什么用):

const express = require('express');const app = express();app.route('/:id').all( (req, res, next) => {console.log('all');next(); }).get( (req, res, next) => {res.send('get');next() }).all( (req, res, next) => {console.log('tail'); });app.route('/').all( (req, res) => {res.send('ok')});app.param('id', (req, res, next, value) => {console.log('param', value);next(); });app.listen(8888);

app.params?中的對應函數會先行執行,并且,記得顯式調用?next()?。

Middleware

其實前面講了一些方法,要實現?Middleware?功能,只需要?app.all(/.*/, () => {})?就可以了,?Express?還專門提供了?app.use()?做通用邏輯的定義:

const express = require('express');const app = express();app.all(/.*/, (req, res, next) => {console.log('reg');next(); });app.all('/', (req, res, next) => {console.log('pre');next(); });app.use((req, res, next) => {console.log('use');next(); });app.all('/', (req, res, next) => {console.log('all');res.send('/ here');next(); });app.use((req, res, next) => {console.log('use2');next(); });app.listen(8888);

注意?next()?的顯式調用,同時,注意定義的順序,?use()?和?all()?順序上是平等的。

Middleware?本身也是?(req, res, next) => {}?這種形式,自然也可以和?app?有對等的機制——接受路由過濾,?Express?提供了?Router?,可以單獨定義一組邏輯,然后這組邏輯可以跟?Middleware一樣使用。

const express = require('express'); const app = express(); const router = express.Router();app.all('/', (req, res) => {res.send({a: '123'}); });router.all('/a', (req, res) => {res.send('hello'); });app.use('/route', router);app.listen(8888);

功能開關,變量容器

app.set()?和?app.get()?可以用來保存?app?級別的變量(對,?app.get()?還和?GET?方法的實現名字上還沖突了):

const express = require('express');const app = express();app.all('/', (req, res) => {app.set('title', '標題123');res.send('ok'); });app.all('/t', (req, res) => {res.send(app.get('title')); });app.listen(8888);

上面的代碼,啟動之后直接訪問?/t?是沒有內容的,先訪問?/?再訪問?/t?才可以看到內容。

對于變量名,?Express?預置了一些,這些變量的值,可以叫?settings?,它們同時也影響整個應用的行為:

  • case sensitive routing
  • env
  • etag
  • jsonp callback name
  • json escape
  • json replacer
  • json spaces
  • query parser
  • strict routing
  • subdomain offset
  • trust proxy
  • views
  • view cache
  • view engine
  • x-powered-by

(上面這些值中,干嘛不放一個最基本的?debug?呢……)

除了基本的?set() / get()?,還有一組?enable() / disable() / enabled() / disabled()?的包裝方法,其實就是?set(name, false)?這種。?set(name)?這種只傳一個參數,也可以獲取到值,等于?get(name)?。

模板引擎

Express?沒有自帶模板,所以模板引擎這塊就被設計成一個基礎的配置機制了。

const process = require('process'); const express = require('express'); const app = express();app.set('views', process.cwd() + '/template');app.engine('t2t', (path, options, callback) => {console.log(path, options);callback(false, '123'); });app.all('/', (req, res) => {res.render('demo.t2t', {title: "標題"}, (err, html) => {res.send(html)}); });app.listen(8888);

app.set('views', ...)?是配置模板在文件系統上的路徑,?app.engine()?是擴展名為標識,注冊對應的處理函數,然后,?res.render()?就可以渲染指定的模板了。?res.render('demo')?這樣不寫擴展名也可以,通過?app.set('view engine', 't2t')?可以配置默認的擴展名。

這里,注意一下?callback()?的形式,是?callback(err, html)?。

端口監聽

app?功能的最后一部分,?app.listen()?,它完成的形式是:

app.listen([port[, host[, backlog]]][, callback])

注意,?host?是第二個參數。

backlog?是一個數字,配置可等待的最大連接數。這個值同時受操作系統的配置影響。默認是 512 。

請求 Request

這一塊倒沒有太多可以說的,一個請求你想知道的信息,都被包裝到?req?的屬性中的。除了,頭。頭的信息,需要使用?req.get(name)?來獲取。

GET 參數

使用?req.query?可以獲取 GET 參數:

const express = require('express'); const app = express();app.all('/', (req, res) => {console.log(req.query);res.send('ok'); });app.listen(8888);

請求:

# -*- coding: utf-8 -*- import requests requests.get('http://localhost:8888', params={"a": '中文'.encode('utf8')})

POST 參數

POST 參數的獲取,使用?req.body?,但是,在此之前,需要專門掛一個 Middleware ,?req.body才有值:

const express = require('express'); const app = express();app.use(express.urlencoded({ extended: true })); app.all('/', (req, res) => {console.log(req.body);res.send('ok'); });app.listen(8888); # -*- coding: utf-8 -*-import requestsrequests.post('http://localhost:8888', data={"a": '中文'})

如果你是整塊扔的 json 的話:

# -*- coding: utf-8 -*-import requests import jsonrequests.post('http://localhost:8888', data=json.dumps({"a": '中文'}),headers={'Content-Type': 'application/json'})

Express?中也有對應的?express.json()?來處理:

const express = require('express'); const app = express();app.use(express.json()); app.all('/', (req, res) => {console.log(req.body);res.send('ok'); });app.listen(8888);

Express?中處理?body?部分的邏輯,是單獨放在?body-parser?這個 npm 模塊中的。?Express?也沒有提供方法,方便地獲取原始 raw 的內容。另外,對于 POST 提交的編碼數據,?Express?只支持 UTF-8 編碼。

如果你要處理文件上傳,嗯,?Express?沒有現成的 Middleware ,額外的實現在?github.com/expressjs/multer?。( Node.js 天然沒有“字節”類型,所以在字節級別的處理上,就會感覺很不順啊)

Cookie

Cookie 的獲取,也跟 POST 參數一樣,需要外掛一個?cookie-parser?模塊才行:

const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser()) app.all('/', (req, res) => {console.log(req.cookies);res.send('ok'); });app.listen(8888);

請求:

# -*- coding: utf-8 -*-import requests import jsonrequests.post('http://localhost:8888', data={'a': '中文'},headers={'Cookie': 'a=1'})

如果 Cookie 在響應時,是配置?res?做了簽名的,則在?req?中可以通過?req.signedCookies?處理簽名,并獲取結果。

來源 IP

Express?對?X-Forwarded-For?頭,做了特殊處理,你可以通過?req.ips?獲取這個頭的解析后的值,這個功能需要配置?trust proxy?這個?settings?來使用:

const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser()) app.set('trust proxy', true); app.all('/', (req, res) => {console.log(req.ips);console.log(req.ip);res.send('ok'); });app.listen(8888);

請求:

# -*- coding: utf-8 -*-import requests import json#requests.get('http://localhost:8888', params={"a": '中文'.encode('utf8')}) requests.post('http://localhost:8888', data={'a': '中文'},headers={'X-Forwarded-For': 'a, b, c'})

如果?trust proxy?不是?true?,則?req.ip?會是一個 ipv4 或者 ipv6 的值。

響應 Response

Express?的響應,針對不同類型,本身就提供了幾種包裝了。

普通響應

使用?res.send?處理確定性的內容響應:

res.send({ some: 'json' }); res.send('<p>some html</p>'); res.status(404); res.end(); res.status(500); res.end();

res.send()?會自動?res.end()?,但是,如果只使用?res.status()?的話,記得加上?res.end()?。

模板渲染

模板需要預先配置,在?Request?那節已經介紹過了。

const process = require('process'); const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser())app.set('trust proxy', false); app.set('views', process.cwd() + '/template'); app.set('view engine', 'html'); app.engine('html', (path, options, callback) => {callback(false, '<h1>Hello</h1>'); });app.all('/', (req, res) => {res.render('index', {}, (err, html) => {res.send(html);}); });app.listen(8888);

這里有一個坑點,就是必須在對應的目錄下,有對應的文件存在,比如上面例子的?template/index.html?,那么?app.engine()?中的回調函數才會執行。都自定義回調函數了,這個限制沒有任何意義,?path, options?傳入就好了,至于是不是要通過文件系統讀取內容,怎么讀取,又有什么關系呢。

Cookie

res.cookie?來處理?Cookie?頭:

const process = require('process'); const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser("key"))app.set('trust proxy', false); app.set('views', process.cwd() + '/template'); app.set('view engine', 'html'); app.engine('html', (path, options, callback) => {callback(false, '<h1>Hello</h1>'); }); app.all('/', (req, res) => {res.render('index', {}, (err, html) => {console.log('cookie', req.signedCookies.a);res.cookie('a', '123', {signed: true});res.cookie('b', '123', {signed: true});res.clearCookie('b');res.send(html);}); });app.listen(8888);

請求:

# -*- coding: utf-8 -*-import requests import jsonres = requests.post('http://localhost:8888', data={'a': '中文'},headers={'X-Forwarded-For': 'a, b, c','Cookie': 'a=s%3A123.p%2Fdzmx3FtOkisSJsn8vcg0mN7jdTgsruCP1SoT63z%2BI'}) print(res, res.text, res.headers)

注意三點:

  • app.use(cookieParser("key"))?這里必須要有一個字符串做?key?,才可以正確使用簽名的 cookie 。
  • clearCookie()?仍然是用“設置過期”的方式來達到刪除目的,cookie()?和?clearCookie()?并不會整合,會寫兩組?b=xx?進頭。
  • res.send()?會在連接上完成一個響應,所以,與頭相關的操作,都必須放在?res.send()?前面。

頭和其它

res.set()?可以設置指定的響應頭,?res.rediect(301, 'http://www.zouyesheng.com')?處理重定向,?res.status(404); res.end()?處理非 20 響應。

const process = require('process'); const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser("key"))app.set('trust proxy', false); app.set('views', process.cwd() + '/template'); app.set('view engine', 'html'); app.engine('html', (path, options, callback) => {callback(false, '<h1>Hello</h1>'); });app.all('/', (req, res) => {res.render('index', {}, (err, html) => {res.set('X-ME', 'zys');//res.redirect('back');//res.redirect('http://www.zouyesheng.com');res.status(404);res.end();}); });app.listen(8888);

res.redirect('back')?會自動獲取?referer?頭作為?Location?的值,使用這個時,注意?referer為空的情況,會造成循環重復重定向的后果。

Chunk 響應

Chunk?方式的響應,指連接建立之后,服務端的響應內容是不定長的,會加個頭:?Transfer-Encoding: chunked?,這種狀態下,服務端可以不定時往連接中寫入內容(不排除服務端的實現會有緩沖區機制,不過我看?Express?沒有)。

const process = require('process'); const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser("key"))app.set('trust proxy', false); app.set('views', process.cwd() + '/template'); app.set('view engine', 'html'); app.engine('html', (path, options, callback) => {callback(false, '<h1>Hello</h1>'); });app.all('/', (req, res) => {const f = () => {const t = new Date().getTime() + '\n';res.write(t);console.log(t);setTimeout(f, 1000);}setTimeout(f, 1000); });app.listen(8888);

上面的代碼,訪問之后,每過一秒,都會收到新的內容。

大概是?res?本身是 Node.js 中的?stream?類似對象,所以,它有一個?write()?方法。

要測試這個效果,比較方便的是直接 telet:

zys@zys-alibaba:/home/zys/temp >>> telnet localhost 8888 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. GET / HTTP/1.1 Host: localhostHTTP/1.1 200 OK X-Powered-By: Express Date: Thu, 20 Jun 2019 08:11:40 GMT Connection: keep-alive Transfer-Encoding: chunkede 1561018300451e 1561018301454e 1561018302456e 1561018303457e 1561018304458e 1561018305460e 1561018306460

每行前面的一個字節的?e?,為 16 進制的 14 這個數字,也就是后面緊跟著的內容的長度,是?Chunk?格式的要求。

Tornado 中的類似實現是:

# -*- coding: utf-8 -*-import tornado.ioloop import tornado.web import tornado.gen import timeclass MainHandler(tornado.web.RequestHandler):@tornado.gen.coroutinedef get(self):while True:yield tornado.gen.sleep(1)s = time.time()self.write(str(s))print(s)yield self.flush()def make_app():return tornado.web.Application([(r"/", MainHandler),])if __name__ == "__main__":app = make_app()app.listen(8888)tornado.ioloop.IOLoop.current().start()

Express?中的實現,有個大坑,就是:

app.all('/', (req, res) => {const f = () => {const t = new Date().getTime() + '\n';res.write(t);console.log(t);setTimeout(f, 1000);}setTimeout(f, 1000); });

這段邏輯,在連接已經斷了的情況下,并不會停止,還是會永遠執行下去。所以,你得自己處理好:

const process = require('process'); const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); app.use(express.urlencoded({ extended: true })); app.use(express.json()); app.use(cookieParser("key"))app.set('trust proxy', false); app.set('views', process.cwd() + '/template'); app.set('view engine', 'html'); app.engine('html', (path, options, callback) => {callback(false, '<h1>Hello</h1>'); });app.all('/', (req, res) => {let close = false;const f = () => {const t = new Date().getTime() + '\n';res.write(t);console.log(t);if(!close){setTimeout(f, 1000);}}req.on('close', () => {close = true;});setTimeout(f, 1000); });app.listen(8888);

req?掛了一些事件的,可以通過?close?事件來得到當前連接是否已經關閉了。

req?上直接掛連接事件,從?net?http?Express?這個層次結構上來說,也很,尷尬了。 Web 層不應該關心到網絡連接這么底層的東西的。

我還是習慣這樣:

app.all('/', (req, res) => {res.write('<h1>123</h1>');res.end(); });

不過?res.write()?是不能直接處理 json 對象的,還是老老實實?res.send()?吧。

我會怎么用 Express

先說一下,我自己,目前在?Express?運用方面,并沒有太多的時間和復雜場景的積累。

即使這樣,作為技術上相對傳統的人,我會以我以往的 web 開發的套路,來使用?Express?。

我不喜歡日常用?app.all(path, callback)?這種形式去組織代碼。

首先,這會使?path?定義散落在各處,方便了開發,麻煩了維護。

其次,把?path?和具體實現邏輯?callback?綁在一起,我覺得也是反思維的。至少,對于我個人來說,開發的過程,先是想如何實現一個?handler?,最后,再是考慮要把這個?handle?與哪些?path?綁定。

再次,單純的?callback?缺乏層次感,用?app.use(path, callback)?這種來處理共用邏輯的方式,我覺得完全是扯談。共用邏輯是代碼之間本身實現上的關系,硬生生跟網絡應用層 HTTP 協議的?path?概念抽上關系,何必呢。當然,對于?callback?的組織,用純函數來串是可以的,不過我在這方面并沒有太多經驗,所以,我還是選擇用類繼承的方式來作層次化的實現。

我自己要用?Express?,大概會這樣組件項目代碼(不包括關系數據庫的?Model?抽象如何組織這部分):

./ ├── config.conf ├── config.js ├── handler │?? ├── base.js │?? └── index.js ├── middleware.js ├── server.js └── url.js
  • config.conf?是 ini 格式的項目配置。
  • config.js?處理配置,包括日志,數據庫連接等。
  • middleware.js?是針對整體流程的擴展機制,比如,給每個請求加一個 UUID ,每個請求都記錄一條日志,日志內容有請求的細節及本次請求的處理時間。
  • server.js?是主要的服務啟動邏輯,整合各種資源,命令行參數?port?控制監聽哪個端口。不需要考慮多進程問題,(正式部署時?nginx?反向代理到多個應用實例,多個實例及其它資源統一用?supervisor?管理)。
  • url.js?定義路徑與?handler?的映射關系。
  • handler?,具體邏輯實現的地方,所有?handler?都從?BaseHandler?繼承。

BaseHandler?的實現:

class BaseHandler {constructor(req, res, next){this.req = req;this.res = res;this._next = next;this._finised = false;}run(){this.prepare();if(!this._finised){if(this.req.method === 'GET'){this.get();return;}if(this.req.method === 'POST'){this.post();return;}throw Error(this.req.method + ' this method had not been implemented');}}prepare(){}get(){throw Error('this method had not been implemented');}post(){throw Error('this method had not been implemented');}render(template, values){this.res.render(template, values, (err, html) => {this.finish(html);});}write(content){if(Object.prototype.toString.call(content) === '[object Object]'){this.res.write(JSON.stringify(content));} else {this.res.write(content);}}finish(content){if(this._finised){throw Error('this handle was finished');}this.res.send(content);this._finised = true;if(this._next){ this._next() }}}module.exports = {BaseHandler};if(module === require.main){const express = require('express');const app = express();app.all('/', (req, res, next) => new BaseHandler(req, res, next).run() );app.listen(8888); }

要用的話,比如?index.js?:

const BaseHandler = require('./base').BaseHandler;class IndexHandler extends BaseHandler {get(){this.finish({a: 'hello'});} }module.exports = {IndexHandler};

url.js?中的樣子:

const IndexHandler = require('./handler/index').IndexHandler;const Handlers = [];Handlers.push(['/', IndexHandler]);module.exports = {Handlers};

日志

后面這幾部分,都不屬于?Express?本身的內容了,只是我個人,隨便想到的一些東西。

找一個日志模塊的實現,功能上,就看這么幾點:

  • 標準的級別: DEBUG,INFO,WARN, ERROR 這些。
  • 層級的多個?logger?。
  • 可注冊式的多種?Handler?實現,比如文件系統,操作系統的?rsyslog?,標準輸出,等。
  • 格式定義,一般都帶上時間和代碼位置。

Node.js 中,大概就是?log4js?了,github.com/log4js-node/log4js-node?。

const log4js = require('log4js');const layout = {type: 'pattern',pattern: '- * %p * %x{time} * %c * %f * %l * %m',tokens: {time: logEvent => {return new Date().toISOString().replace('T', ' ').split('.')[0];}} }; log4js.configure({appenders: {file: { type: 'dateFile', layout: layout, filename: 'app.log', keepFileExt: true },stream: { type: 'stdout', layout: layout }},categories: {default: { appenders: [ 'stream' ], level: 'info', enableCallStack: false },app: { appenders: [ 'stream', 'file' ], level: 'info', enableCallStack: true }} });const logger = log4js.getLogger('app'); logger.error('xxx');const l2 = log4js.getLogger('app.good'); l2.error('ii');

總的來說,還是很好用的,但是官網的文檔不太好讀,有些細節的東西沒講,好在源碼還是比較簡單。

說幾點:

  • getLogger(name)?需要給一個名字,否則?default?的規則都匹配不到。
  • getLogger('parent.child')?中的名字,規則匹配上,可以通過?.?作父子繼承的。
  • enableCallStack: true?加上,才能拿到文件名和行號。

ini 格式配置

json 作配置文件,功能上沒問題,但是對人為修改是不友好的。所以,個人還是喜歡用 ini 格式作項目的環境配置文件。

Node.js 中,可以使用?ini?模塊作解析:

const s = ` [database] host = 127.0.0.1 port = 5432 user = dbuser password = dbpassword database = use_this_database[paths.default] datadir = /var/lib/data array[] = first value array[] = second value array[] = third value `const fs = require('fs'); const ini = require('ini');const config = ini.parse(s); console.log(config);

它擴展了?array[]?這種格式,但沒有對類型作處理(除了?true?false),比如,獲取?port?,結果是?"5432"?。簡單夠用了。

WebSocket

Node.js 中的 WebSocket 實現,可以使用?ws?模塊, github.com/websockets/ws?。

要把?ws?的 WebSocket Server 和?Express?的?app?整合,需要在?Express?的?Server?層面動手,實際上這里說的?Server?就是 Node.js 的?http?模塊中的?http.createServer()?。

const express = require('express'); const ws = require('ws');const app = express();app.all('/', (req, res) => {console.log('/');res.send('hello'); });const server = app.listen(8888);const wss = new ws.Server({server, path: '/ws'}); wss.on('connection', conn => {conn.on('message', msg => {console.log(msg);conn.send(new Date().toISOString());}); });

對應的一個客戶端實現,來自:?github.com/ilkerkesen/tornado-websocket-client-example/blob/master/client.py

# -*- coding: utf-8 -*-import time from tornado.ioloop import IOLoop, PeriodicCallback from tornado import gen from tornado.websocket import websocket_connectclass Client(object):def __init__(self, url, timeout):self.url = urlself.timeout = timeoutself.ioloop = IOLoop.instance()self.ws = Noneself.connect()PeriodicCallback(self.keep_alive, 2000).start()self.ioloop.start()@gen.coroutinedef connect(self):print("trying to connect")try:self.ws = yield websocket_connect(self.url)except Exception:print("connection error")else:print("connected")self.run()@gen.coroutinedef run(self):while True:msg = yield self.ws.read_message()print('read', msg)if msg is None:print("connection closed")self.ws = Nonebreakdef keep_alive(self):if self.ws is None:self.connect()else:self.ws.write_message(str(time.time()))if __name__ == "__main__":client = Client("ws://localhost:8888/ws", 5)


原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的Express 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩精品一区二区三区在线视频 | 伊人永久在线 | 国产99久久九九精品免费 | 国产一区二区免费看 | 国产亚洲视频在线免费观看 | av片中文 | 一本一本久久a久久精品综合 | 国产高清免费在线观看 | 国产一区在线免费观看 | 国产999在线 | 日日夜夜网 | 免费福利在线播放 | 综合色狠狠 | 成人av片免费看 | 欧美色操 | 国产视频精品久久 | 国产精品国产精品 | 国产成人久久精品一区二区三区 | 香蕉色综合 | 摸bbb搡bbb搡bbbb| 久久国产精品一国产精品 | 天天干天天干天天射 | 一二三区av | 亚洲精品啊啊啊 | 97av免费视频| 欧美一级欧美一级 | 欧美专区国产专区 | 久久久久久黄 | 黄色软件在线看 | 91天天视频 | 亚洲视频在线免费观看 | 精品国产精品久久一区免费式 | 欧美日韩性生活 | 色综合久久88色综合天天免费 | 亚洲综合视频在线观看 | 日韩二区三区在线 | 免费av看片| 国产一级做a| 久久久精品小视频 | 91.精品高清在线观看 | 亚洲精品在线观看网站 | 91一区在线观看 | 成人免费看片网址 | 免费合欢视频成人app | 亚洲精品国精品久久99热 | 欧美一级免费黄色片 | 日韩午夜小视频 | 99在线精品视频 | 日韩手机视频 | 国产精品字幕 | 99精品国产一区二区三区不卡 | 国产精品亚洲精品 | 亚洲免费在线视频 | 亚洲国产精品久久 | 激情偷乱人伦小说视频在线观看 | 伊人天堂网 | 国产一区二三区好的 | 日韩色中色 | 欧美精品亚州精品 | 天天干天天操天天操 | 色视频在线 | 亚洲激情av | 91超国产| 国产精品免费一区二区 | 国产精品剧情 | 国产精品久久久久婷婷 | 999视频网站 | 欧美一级片在线免费观看 | 色九九在线 | 911香蕉视频| 日本精品视频在线 | 亚洲作爱视频 | 五月天六月婷 | 日韩免费网址 | 天天性天天草 | 激情偷乱人伦小说视频在线观看 | 亚洲一级影院 | 久久乐九色婷婷综合色狠狠182 | 亚洲精品国产成人av在线 | 精品五月天| 91片在线观看 | 中文字幕精品视频 | 婷婷久操 | 九精品 | 99精品视频在线看 | 黄色毛片视频 | 亚洲天天在线 | 日韩黄色大片在线观看 | 激情综合网婷婷 | 激情久久久久久久久久久久久久久久 | 永久免费的av电影 | 麻豆国产精品va在线观看不卡 | 91成人精品一区在线播放69 | 天天操天天干天天爽 | 亚洲精选久久 | 狠狠色噜噜狠狠 | 四川妇女搡bbbb搡bbbb搡 | 国产精品女人久久久久久 | 国产在线精品一区二区不卡了 | 麻豆成人精品视频 | 欧美伦理电影一区二区 | 精品欧美一区二区在线观看 | 91传媒91久久久 | 亚洲综合在线发布 | 亚洲一区网站 | 天天干天天拍 | 欧美精品久久久久久久免费 | 午夜精品视频在线 | 久久久www成人免费精品张筱雨 | 日日夜夜爱 | 天天天在线综合网 | 中国黄色一级大片 | 1024在线看片| 国产成人精品久久 | 日韩午夜电影网 | 香蕉网在线播放 | 91秒拍国产福利一区 | 久久精品视频在线观看免费 | 色婷婷激婷婷情综天天 | 黄色免费大片 | 国产在线看一区 | 久久手机免费视频 | 欧美一级性 | 欧美日韩中文在线观看 | 免费能看的黄色片 | 久久亚洲人| 国产精品欧美久久久久久 | 西西444www | av一区在线 | 亚洲欧洲在线视频 | 久久久黄色 | 黄色av网站在线观看免费 | 97超碰人人看 | 夜夜爱av| 日韩va欧美va亚洲va久久 | www成人av | 亚洲闷骚少妇在线观看网站 | 久久精品视频国产 | av官网在线 | 亚洲精品成人av在线 | 黄色免费网站 | 91桃色在线观看视频 | 成人h在线| 又黄又爽又色无遮挡免费 | 欧美ⅹxxxxxx| 五月天综合网站 | 91精品国产欧美一区二区成人 | 99热最新精品 | 精品视频在线免费 | 国产成人精品久久二区二区 | 人人爽人人爽人人片 | 全久久久久久久久久久电影 | 在线观看免费黄色 | 色多多在线观看 | 午夜成人影视 | 国产午夜麻豆影院在线观看 | 久久久久久久久久久久久9999 | 精品国产一区二区三区久久影院 | 日本久久免费电影 | 欧美无极色 | 国外调教视频网站 | 亚洲在线色| 精品一区二区三区久久 | 欧美亚洲精品在线观看 | 久草视频中文在线 | 超碰97久久 | 国产精品欧美激情在线观看 | 91精品国产自产在线观看 | 久久一区二区三区国产精品 | 国产美女视频 | 男女男视频 | 91成人免费电影 | 久久九九影视网 | 欧美日韩在线视频一区 | 国产视频久久久 | 在线播放亚洲 | 色婷婷激情网 | 久久久黄视频 | 99九九视频 | 免费在线观看一区 | 伊人国产在线播放 | 91久久精品日日躁夜夜躁国产 | 天天天天天干 | av动图| 深爱婷婷激情 | 久久精品国产99国产 | 精品一区二区三区久久久 | 国产精品一区二区中文字幕 | 中文字幕精品一区二区三区电影 | 精品国产一区二区三区久久久蜜月 | 国产精品成人自拍 | 91在线区| 天天射天天射天天 | 国产成人av在线 | 国产美女视频网站 | 综合在线观看色 | 亚洲免费在线播放视频 | 日韩美女高潮 | 国产精品免费人成网站 | 精品日本视频 | 黄视频网站大全 | 在线看的av网站 | 亚洲乱码在线观看 | 久久人人爽人人片av | 国产在线国偷精品产拍免费yy | 国产午夜精品一区二区三区在线观看 | 99这里精品 | 三级av在线播放 | av 一区二区三区四区 | 国产精品永久在线观看 | 亚洲欧美激情插 | 久草视频免费观 | 国产网红在线观看 | 欧美激情xxxx | 久久精品国产精品亚洲 | 国产不卡毛片 | 免费a v网站| 欧美日韩精品免费观看 | 国产精品1000 | 亚洲最新视频在线 | 99久久夜色精品国产亚洲 | 午夜精品久久久久久久99婷婷 | 一区电影 | 亚洲国产精品久久久 | 在线国产欧美 | 久久好看免费视频 | 亚洲精品小视频在线观看 | 天天干天天操天天入 | 成人超碰97| 在线观看91网站 | 最近中文字幕完整高清 | 久久在线精品视频 | a√天堂资源 | 亚洲成a人片在线www | 日韩欧美第二页 | 国产精品久久久久久久久久妇女 | 91热视频在线观看 | 91夫妻自拍 | 丝袜美女在线 | 久久久久久99精品 | www国产一区 | a视频免费在线观看 | 中文字幕精品一区二区精品 | 91麻豆精品国产自产 | 天天干天天摸 | 精品91 | 狠狠色丁香久久综合网 | 国产传媒中文字幕 | 免费a视频| 成人黄色大片在线免费观看 | 夜夜骑首页 | av观看网站 | 91视频这里只有精品 | 亚洲一区二区三区毛片 | 成人免费观看电影 | 2021av在线 | 91精品久久久久久久91蜜桃 | 99re6热在线精品视频 | 人人看人人爱 | 久久久影视 | 亚洲视频一区二区三区在线观看 | 欧美一区三区四区 | 免费看黄的 | 国语久久 | www.久久99 | 亚洲精品乱码久久久久久写真 | 中文字幕免费高清 | 91精品在线免费观看视频 | 在线观看亚洲 | 午夜影院一级 | av免费网 | 久久经典视频 | 69久久久 | 特级西西www44高清大胆图片 | 亚洲免费精品视频 | 99成人在线视频 | 欧美精品乱码久久久久久按摩 | 99久久99久久精品免费 | 999在线精品 | 日日夜夜网| 五月天伊人 | www.久久成人 | 国产精品视频久久 | 免费网址你懂的 | 午夜av片 | 精品字幕在线 | 日日爽 | 青青草久草在线 | 婷婷99| 日本韩国精品一区二区在线观看 | 日本爱爱免费 | 国产精品免费成人 | 亚洲黄色在线观看 | 亚洲区视频在线观看 | 美女视频网站久久 | 国产精品久久久久久久久久久久午夜片 | 99久久精品久久久久久动态片 | 国产精品久久久久一区二区国产 | 91av九色 | 首页中文字幕 | 久久精品亚洲综合专区 | 国产又粗又猛又黄又爽的视频 | 制服丝袜在线91 | 久久99影院 | 久久久精品小视频 | 亚洲永久精品国产 | 亚洲欧美国产精品18p | 2021国产精品| 日韩综合在线观看 | 2019中文字幕第一页 | 国产看片免费 | 午夜精品久久久久久久99热影院 | 亚洲视频中文 | 黄色在线免费观看网址 | 国产成人61精品免费看片 | 久久久久久久久久久久久9999 | 精品亚洲一区二区三区 | 国产精品去看片 | 久久伦理 | 有码中文字幕 | 天天操天天干天天插 | 婷婷免费视频 | www.天天干| 成人av地址 | 久久精品理论 | bayu135国产精品视频 | 国产一级在线播放 | 精品福利网 | 在线观看av免费观看 | 99热99 | 伊人在线视频 | 久久不射电影院 | 日韩免费电影网 | 91看国产| 色婷婷播放 | 99视频在线观看视频 | 久久综合九色综合欧美就去吻 | 日韩一区二区三区视频在线 | 欧美做受高潮电影o | 久久五月婷婷综合 | 日日干日日色 | 中文字幕在线观看视频一区二区三区 | 天天干天天草天天爽 | 精品少妇一区二区三区在线 | 福利一区在线视频 | 成人宗合网 | 日韩精品一区二区三区免费视频观看 | 中文字幕在线观看1 | 国产精品国产三级国产不产一地 | 成人av在线电影 | 激情深爱.com | 91精品国产91久久久久 | 日韩精品一区二区三区第95 | 蜜臀久久99精品久久久酒店新书 | 超碰99人人 | 91亚洲精品国偷拍 | 日韩有码中文字幕在线 | 超碰99在线 | 在线免费观看视频一区 | 黄色av播放 | 五月婷婷欧美视频 | 免费h精品视频在线播放 | 午夜精品区 | 狠狠色噜噜狠狠狠狠2022 | 日韩三级中文字幕 | 精品久久久久久久 | 香蕉看片| 97成人在线观看视频 | 美女视频永久黄网站免费观看国产 | 国产精品久久久久久久久久直播 | 久久综合九色综合网站 | 久草免费资源 | 欧美精品九九99久久 | 国产成人免费观看久久久 | 夜色成人av | 日韩欧美一区二区三区黑寡妇 | 成年人免费在线播放 | 天天色中文| 日本在线视频网址 | 国内精品久久久久影院一蜜桃 | 手机av资源| 国内视频1区 | 91av国产视频 | 国产精品精品久久久 | 日本福利视频在线 | 久久久精品综合 | 国产精品久久艹 | 亚洲精品高清一区二区三区四区 | www.亚洲| 国产高清中文字幕 | 亚洲mv大片欧洲mv大片免费 | 久久九九影视 | 亚洲永久免费av | 五月激情av| 在线观看爱爱视频 | 福利一区在线 | 国产精品成人自产拍在线观看 | 夜夜高潮夜夜爽国产伦精品 | 国产精品国产三级国产不产一地 | 国产精品6999成人免费视频 | 国产精品免费观看在线 | 国产亚洲情侣一区二区无 | 黄在线免费看 | 免费三及片 | 香蕉视频在线观看免费 | 中文字幕视频播放 | 久久久精品免费看 | 国产美女无遮挡永久免费 | 国产精品mv | 久久精品中文视频 | 丁香花五月 | 精品婷婷 | 久久尤物电影视频在线观看 | 婷婷色在线视频 | 久久激情小说 | 亚洲精品视频免费在线 | 91中文字幕 | 99精品国产在热久久 | 91精品久久久久久粉嫩 | 亚洲色图激情文学 | av久久久 | 亚洲少妇xxxx| 四虎8848免费高清在线观看 | 日本精品视频免费观看 | 精品a在线| 国际av在线| 国产精品1区2区 | 亚洲欧美日本一区二区三区 | 久久久久亚洲天堂 | 一级黄色视屏 | 国产精品密入口果冻 | 日韩欧美视频在线 | 天天草综合 | 久久资源在线 | 视频三区在线 | 69国产成人综合久久精品欧美 | 亚洲精品www | 黄a在线观看| 久久99精品国产99久久 | 久久精品99精品国产香蕉 | 欧美一区二区三区免费观看 | 亚洲污视频 | 久久综合99 | 国产一级做a | 日韩高清无线码2023 | 我要看黄色一级片 | 国产亚洲精品福利 | 999电影免费在线观看2020 | 在线婷婷 | 亚洲极色| 国产精品爽爽爽 | 免费精品视频在线 | 狠狠色丁香久久婷婷综合五月 | 欧美成年人在线视频 | 亚洲一级片在线观看 | 亚洲一级片在线观看 | 国产精品自产拍在线观看蜜 | 天天做天天爱天天爽综合网 | 日本最新高清不卡中文字幕 | 国产91亚洲精品 | 999视频在线播放 | 日韩中文字幕免费在线观看 | 天天干夜夜爱 | 国产在线精品国自产拍影院 | 综合伊人久久 | 免费在线观看污网站 | 四虎在线观看 | 国产精品免费一区二区三区在线观看 | 久久,天天综合 | 国产精品女人久久久久久 | 免费在线观看的av网站 | 天天色天天综合 | 久久中文字幕在线视频 | 欧美精品久久久久久久久久丰满 | 国产黄色片免费看 | 久久热亚洲| 99国产视频 | 天天操天天射天天爱 | 久久精久久精 | 久久精品96 | 99精品在线观看视频 | 激情开心| 久久综合婷婷国产二区高清 | 99久久国产免费免费 | 亚洲视频大全 | 久久精品99国产精品亚洲最刺激 | 日韩欧美视频在线免费观看 | 夜夜爽www | 青草视频网 | av黄免费看 | 国产一区网 | 亚洲最新av在线 | 一区二区三区日韩精品 | 欧美另类xxx | 久久中文精品视频 | 色com| 久久国色夜色精品国产 | 亚洲精品国久久99热 | 九9热这里真品2 | 欧美日韩国产一区二区三区在线观看 | 日本三级不卡 | av中文字幕电影 | 97超在线视频| 黄在线免费观看 | 亚洲国内在线 | 欧美一级性 | 黄色avwww| 人人澡人人添人人爽一区二区 | 最近最新最好看中文视频 | 国产+日韩欧美 | 在线看v片成人 | 亚洲国产资源 | 国产精品高清一区二区三区 | 亚洲国产无 | 久久久五月婷婷 | 日韩免费在线 | 欧美美女激情18p | 香蕉视频在线免费看 | 中文字幕成人在线 | 91av视频在线免费观看 | 日韩无在线 | 人人插人人做 | 特及黄色片 | 美女网站在线观看 | 午夜视频二区 | 国产做爰视频 | 久草网站在线 | 久草在线免 | 欧美91片 | 日韩精品视频在线免费观看 | 久久爱综合 | 91丨九色丨勾搭 | 久久九九精品久久 | 亚洲日韩中文字幕 | 国产成人av在线 | 在线观看黄色小视频 | 狠狠的干| 亚洲欧美日韩国产一区二区三区 | a级国产毛片 | 亚洲黄色av网址 | 久久国产a | 国产一区视频导航 | 五月开心六月婷婷 | 91免费国产在线观看 | 天天激情天天干 | 欧亚久久 | 91精品91| 国产成人一区二区三区影院在线 | 亚洲欧美日韩一二三区 | 色综合激情久久 | 99热国产在线中文 | av在线a| 91亚洲精品久久久蜜桃网站 | 中国一级片在线 | 五月婷婷综合久久 | 在线视频中文字幕一区 | 欧美日韩久久不卡 | 国产视频二区三区 | 国内久久久久 | 国产免费三级在线观看 | 中文字幕视频免费观看 | 国产对白av | 成年人视频在线观看免费 | 青青草在久久免费久久免费 | 久久免费美女视频 | 精品国产一区二区三区四区在线观看 | 国内精自线一二区永久 | 三级在线视频观看 | 色wwww| 4hu视频| 99热999 | 成人av一区二区三区 | 久草在线视频网站 | 日本在线观看中文字幕无线观看 | 久久精品视频18 | 五月开心激情网 | 欧美日韩一级久久久久久免费看 | 97在线观看免费高清完整版在线观看 | 国产精品一区二区久久 | 中文字幕 国产精品 | 免费黄色av片 | 在线国产精品一区 | 黄视频网站大全 | 久久综合免费视频 | 九九久久免费视频 | 97福利社| 91激情视频在线 | av免费在线观看网站 | 国产精品国产三级国产aⅴ无密码 | av电影免费在线播放 | 六月色| 91高清完整版在线观看 | 激情视频二区 | 特级西西人体444是什么意思 | 在线免费观看视频 | 国产一级电影 | 日韩精品电影在线播放 | 九九在线免费视频 | a黄色大片 | 久久久久欧美精品 | 亚洲日日夜夜 | 欧美高清视频不卡网 | 精品96久久久久久中文字幕无 | 国产a国产 | 亚洲一级片在线看 | 亚洲在线资源 | 97超碰人人澡人人 | 久久国产午夜精品理论片最新版本 | 久久私人影院 | 高清久久久久久 | 丁香婷婷综合激情五月色 | 久久综合99| 色综合久久久久久中文网 | 成人国产一区二区 | 亚洲婷婷伊人 | 免费精品视频 | 久久久久久久免费看 | 亚洲欧美在线观看视频 | 男女免费视频观看 | 国产精品亚洲精品 | 欧美色婷 | 91精品影视 | 婷婷综合在线 | 91成人在线观看高潮 | 久久爱资源网 | www.狠狠色.com | 韩国av电影网 | 精品在线视频一区二区三区 | 亚洲永久av | 国产精品成人久久久 | 久热av在线 | 国产在线看一区 | 久久精品久久久久电影 | 精品国产成人av在线免 | 狠狠的干 | 伊人色综合网 | 亚洲涩涩涩 | 韩国三级av在线 | 美女黄濒| 91社区国产高清 | 国产精品乱码一区二区视频 | 99久久爱 | 色婷婷88av视频一二三区 | 婷婷丁香九月 | 在线免费黄色av | 美女黄频视频大全 | 日本美女xx| 久久天堂影院 | 美女视频久久黄 | 三级在线国产 | 亚州天堂 | 91综合久久一区二区 | 国产在线污 | 这里只有精彩视频 | 色全色在线资源网 | 日韩黄色在线观看 | 91视频在线免费下载 | 99精品视频免费看 | 狠狠色丁香婷婷综合久小说久 | 伊人手机在线 | 中文字幕在线观看一区二区 | 99色资源 | 国产成人91| 视频直播国产精品 | 久久99视频 | 插久久| 亚洲综合在线播放 | 久久久久久免费网 | 91手机电视 | 91久久国产精品 | avsex| 久久精品牌麻豆国产大山 | 夜夜躁天天躁很躁波 | 日本少妇视频 | 久久精彩免费视频 | 婷婷激情5月天 | 亚洲欧洲精品视频 | 亚洲日本欧美在线 | 综合色天天 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 日韩三级在线观看 | 亚洲国产色一区 | 人人草天天草 | 亚洲va在线va天堂va偷拍 | 最近免费中文视频 | 成人禁用看黄a在线 | 亚洲成人免费在线观看 | 99在线免费观看 | 日韩精品久久久久久中文字幕8 | 青草草在线 | 久久综合久久综合久久 | 日韩精品一区二区三区中文字幕 | 中文在线免费看视频 | 国产精品久久久久久久毛片 | 久久久久国产精品一区二区 | 五月花丁香婷婷 | 欧美日韩在线看 | 日本成人黄色片 | 欧美激情精品久久久久久 | 久久久综合色 | 美女搞黄国产视频网站 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 国产成人精品综合久久久久99 | 免费色视频网站 | 奇米四色影狠狠爱7777 | 国产精品18久久久久久不卡孕妇 | 亚洲视频 视频在线 | 久草视频免费在线播放 | 日韩理论电影在线观看 | www.色午夜 | 999视频在线播放 | 麻豆一二| 狠狠色伊人亚洲综合成人 | 免费成人黄色 | 天天干天天弄 | 国产精品欧美久久久久久 | 涩涩网站在线观看 | 亚洲激情五月 | 麻豆一区二区三区视频 | 超级碰99 | 成人全视频免费观看在线看 | 日本中文在线观看 | 欧美精品中文在线免费观看 | 国产老太婆免费交性大片 | 亚洲天堂在线观看完整版 | 在线播放91| 久久精品精品 | 国产一区二区网址 | 激情影音 | 九九九九九九精品 | 国产资源网| 亚洲国产精品人久久电影 | 久久手机免费观看 | 国产午夜三级一二三区 | 国产精品久久99精品毛片三a | 日韩色高清 | 国产一区二区不卡视频 | 国产精品美女久久久久久网站 | 天天插综合网 | 亚洲永久精品视频 | 国产一级黄大片 | 亚洲视频1区2区 | 四虎www com | 四虎在线观看 | 综合色爱| 日韩av一区二区三区在线观看 | 国产99免费视频 | 久久久精品国产一区二区三区 | 婷婷久久一区二区三区 | 久热免费在线 | 亚洲国产激情 | 欧美性春潮 | 久久字幕 | 99久久99久久精品国产片 | 成人在线播放视频 | 99久久99 | 成人蜜桃视频 | 在线婷婷 | 国产色视频网站 | 亚州精品天堂中文字幕 | 亚洲精品va| 欧美日韩一区久久 | 91av色| 国产亚州av| 午夜黄色影院 | 国产在线观看黄 | 九九热免费观看 | 国产免费看 | 亚洲日韩中文字幕在线播放 | 欧美国产视频在线 | 欧美日韩视频免费 | 亚洲人成影院在线 | 国产网红在线观看 | 高清在线一区二区 | 久久老司机精品视频 | 国产精品久久久免费 | 免费a v在线| 国产精品久久久久免费a∨ 欧美一级性生活片 | 一区二区三区在线视频111 | 婷婷综合影院 | 黄色的网站免费看 | 最近免费中文视频 | 国产一级二级在线播放 | 免费a v在线 | 久久久久久久电影 | 少妇性aaaaaaaaa视频 | 波多野结衣在线播放一区 | 久久久久久片 | 亚洲电影网站 | 天天综合网久久 | 激情欧美一区二区免费视频 | 在线成人免费电影 | 免费高清无人区完整版 | 欧美va天堂va视频va在线 | 久久久久久免费 | 91最新在线观看 | 亚洲少妇影院 | 日韩欧美综合视频 | 亚洲人在线视频 | 亚洲精品乱码久久久久久 | 国产v视频 | av在线播放不卡 | 国产美女在线免费观看 | 久久久久久久久久亚洲精品 | 黄色看片 | 国产日韩欧美视频在线观看 | 日日爽天天 | 玖玖在线资源 | 视频在线播放国产 | 精品一区二区亚洲 | 日韩欧美视频在线免费观看 | 黄色国产高清 | 欧美精品在线观看一区 | 国产精品成人久久久久久久 | 色婷婷激情四射 | 色婷婷视频网 | www.黄色小说.com | 国产一级二级在线观看 | 久久电影中文字幕视频 | 国产亚洲精品美女久久 | 色网址99 | 丁香婷婷综合激情五月色 | 免费色视频网站 | 亚洲黄色在线免费观看 | 免费日韩 精品中文字幕视频在线 | 免费看的黄网站软件 | 亚洲精品国产综合99久久夜夜嗨 | 808电影 | 久久精彩视频 | 久久成人国产精品免费软件 | 91亚色免费视频 | 欧美成人猛片 | 国产成人精品三级 | 成人免费观看av | 久久精品国产一区二区三 | 97视频人人免费看 | 日韩a在线 | 中文字幕最新精品 | 久久躁日日躁aaaaxxxx | 国语对白少妇爽91 | 99产精品成人啪免费网站 | 精品久久精品久久 | 成人在线视频论坛 | 精品国产一区二区三区久久久 | 久久久久久久久久久久亚洲 | 亚洲天堂精品视频 | 成人午夜黄色影院 | av在线收看 | 久久艹人人 | 一级黄色网址 | 91精品国产一区二区三区 | 在线观看完整版 | 免费成人黄色av | 亚洲一级片在线看 | 中文字幕在线看视频国产 | 久久国产精品99久久久久久丝袜 | 欧美国产精品一区二区 | 99热精品在线观看 | 国产一级片一区二区三区 | 亚洲综合激情 | 在线观看中文字幕dvd播放 | 国产涩涩在线观看 | 日韩精品一区二区三区电影 | 国产麻豆视频在线观看 | 日日插日日干 | 操操操人人 | 国产婷婷在线观看 | 成人在线观看免费 | 96在线| 乱子伦av | 日韩在线观看你懂得 | a天堂最新版中文在线地址 久久99久久精品国产 | 91精品人成在线观看 | 中文字幕在线免费看线人 | 国产69精品久久久久99 | 一级黄色片毛片 | 精品国产一区二区在线 | 欧洲av不卡 | 国产剧情一区二区 | 久久久久国产精品免费免费搜索 | 九九免费在线观看 | 一区二区三区日韩在线观看 | 国内精品久久久久久久久久久久 | 欧美狠狠操 | 一区二区视频免费在线观看 | 黄色片亚洲 | 亚洲一级理论片 | 国产精品婷婷午夜在线观看 | 91天堂在线观看 | 午夜精品电影一区二区在线 | 91久久久久久国产精品 | 国产精品一区电影 | 午夜精品久久久久久久久久 | 久久国产精品一区二区三区 | 一区二区三区免费在线观看 | 婷婷六月丁香激情 | 综合天堂av久久久久久久 | 日韩在线观看高清 | 欧美精品久久久久久久亚洲调教 | 久久天天躁狠狠躁亚洲综合公司 | 国产不卡在线视频 | www.福利 | 久久久黄色 | 欧美日韩在线视频免费 | 97超碰人人澡人人爱学生 | 91爱爱免费观看 | 久久全国免费视频 | 免费视频色| 日韩精品久久久免费观看夜色 | 国产成人精品国内自产拍免费看 | 狠狠躁18三区二区一区ai明星 | 97超碰在线资源 | 麻豆精品在线 | 13日本xxxxxⅹxxx20 | 免费看国产视频 | 国产精品99精品 | 9999在线视频| 国产精品video爽爽爽爽 | 亚洲一区二区精品视频 | 韩国视频一区二区三区 | 最近中文字幕国语免费高清6 | 夜夜嗨av色一区二区不卡 | 国产黄色精品在线观看 | 超碰在线94 | 999久久| 日韩有码专区 | 97在线视频免费看 | 色视频在线免费 | 天天操天天干天天 | 久久欧美在线电影 | 午夜精品一区二区三区在线观看 | 中文在线√天堂 | 9在线观看免费高清完整版在线观看明 | 黄色小说在线免费观看 | 99热这里有精品 | 麻豆91在线看 | 精品毛片在线 | 91色一区二区三区 | 久热免费在线 | 在线观看黄色免费视频 | 成人在线视频观看 | 超碰97国产| 色婷婷www| 最近免费中文字幕mv在线视频3 | 亚洲涩涩网 | 精品一区二区电影 | 在线看成人 | 欧美先锋影音 | 国产免费黄视频在线观看 | 欧美国产亚洲精品久久久8v | 国产精品资源网 | 992tv又爽又黄的免费视频 | 麻豆久久久久久久 | 三级午夜片 | 日韩大陆欧美高清视频区 | 一级黄视频 | 日韩在线无 | 蜜臀av在线一区二区三区 | 免费看一级片 | 伊人va| 国产免费黄视频在线观看 | 国产精品久久99综合免费观看尤物 | 亚洲一区二区三区精品在线观看 | 国产91影院 | 免费观看91视频 | 久久综合色8888 | 天天曰夜夜操 | 久久久久久久久久久免费视频 | 久久涩涩网站 | 亚洲精品国产综合久久 | 久久电影国产免费久久电影 | 婷婷色六月天 | 天天夜夜狠狠操 | 91插插视频| 最新av观看 | 九色精品免费永久在线 | 欧美一区二区日韩一区二区 | 国产精品久久久久婷婷 | 日本韩国精品一区二区在线观看 | 国内精品中文字幕 | 国产精品免费大片视频 | 亚洲黄色区 | 国产精品毛片久久久 | 午夜精品久久久久久久99婷婷 | 黄色影院在线免费观看 | 成年人看片网站 | 国产人成在线视频 | 人人看黄色 | 国产亚洲精品久久19p | 欧美一级爽 | av在线电影免费观看 | 久久96| 91女子私密保健养生少妇 | 免费看黄在线网站 | 国产精品嫩草影院99网站 | 国产精品一区二区中文字幕 | 天天插天天干 | 久久免费国产视频 |