最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

express express-session的使用小結(jié)

 更新時(shí)間:2018年12月12日 08:57:45   作者:ASCll  
這篇文章主要介紹了express express-session的使用小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

簡(jiǎn)介

express-session是express中的一個(gè)處理session的中間件,可以說(shuō)是express中最常見(jiàn)的中間件之一了.

由于會(huì)話管理依賴cookie的使用,所以它的api中有很多用于控制cookie的部分.

總的來(lái)說(shuō)express-session有如下的特點(diǎn):

  • session管理(基本功能)
  • cookie簽名
  • 可替換持久儲(chǔ)存模塊

本文中使用的版本為1.15.6.

安裝

npm install express-session --save

引入&使用

const express = require('express');
const app = new express();
const expressSession = require('express-session');

// 使用express-session
app.use(expressSession({
  secret:'hello world',// cookie簽名 這個(gè)屬性是必須的 具體配置和`cookie-parser`一樣
  saveUninitialized:true, // 是否自動(dòng)初始化 默認(rèn)為true
  resave:false,// 當(dāng)用戶session無(wú)變化的時(shí)候依然自動(dòng)保存
  cookie:{ // cookie的信息具體操作和`cookie-parser`一樣
    maxAge:1800000// 30分鐘后過(guò)期
  },
  rolling:true// 每次請(qǐng)求的時(shí)候覆寫cookie
}))

會(huì)話簡(jiǎn)介

在express-session文檔中有如下的一句說(shuō)明:

Note Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.

Session中包含的數(shù)據(jù)不會(huì)保存在cookie中,僅僅是在cookie中保存了一個(gè)SessionId而已.實(shí)際的session的數(shù)據(jù)保存在服務(wù)端.

簡(jiǎn)單理解就是一個(gè)Map,鍵對(duì)應(yīng)的是session id值保存在cookie中,值對(duì)應(yīng)的是用戶保存在服務(wù)端的數(shù)據(jù).

api介紹

參數(shù)

創(chuàng)建express-cookie參數(shù)基本分為兩種.

  • 針對(duì)于cookie的設(shè)置
  • 針對(duì)于express-session的設(shè)置

cookie設(shè)置一覽:

app.use(expressSession({
  secret:'hello world', // cookie 簽名必須有否則會(huì)報(bào)錯(cuò)
  cookie:{
    domain:<參數(shù)>,
    expires:<參數(shù)>,
    httpOnly:<參數(shù)>,
    path:<參數(shù)>,
    sameSite:<參數(shù)>,
    secure:<參數(shù)>,
    maxAge:1800000
  }
}));

而這些對(duì)應(yīng)的參數(shù)就是服務(wù)端對(duì)于cookie的寫入?yún)?shù),至于各個(gè)參數(shù)是什么意思參考下面的文章:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie

express-session部分設(shè)置:

app.use(expressSession({
  secret:'hello world', // cookie 簽名必須有否則會(huì)報(bào)錯(cuò)
  genid:function (request) { // 用于替換掉默認(rèn)ID生成的函數(shù) 第一個(gè)參數(shù)為reqeust
    return '隨機(jī)id'
  },
  name:'connect.sid',// 每次響應(yīng)中向cookie中起始的內(nèi)容,默認(rèn)起始為`connect.sid`,
  proxy:true,// 對(duì)于cookie使用secure后,在傳遞的過(guò)程中相信反向代理服務(wù)器,默認(rèn)為undefined只相信正向代理
  resave:true,// 在一次會(huì)話中無(wú)論是否session被改變都會(huì)進(jìn)行強(qiáng)制的儲(chǔ)存
  rolling:true,// 在每次會(huì)話中的響應(yīng)中都覆寫一次cookie,重置倒計(jì)時(shí)
  saveUninitialized:true,// 將一個(gè)新創(chuàng)建還未修改的會(huì)話進(jìn)行儲(chǔ)存,默認(rèn)為true
  store:object// 一個(gè)儲(chǔ)存對(duì)象,默認(rèn)使用的是`MemoryStore`這個(gè)存儲(chǔ)器
  unset:'keep'// 控制沒(méi)有設(shè)置`req.session`時(shí)候的行為(使用delete刪除或者賦值null),默認(rèn)'keep'會(huì)話期間不會(huì)保留,'destroy'會(huì)話完成后刪除.
}));

方法

request.session上掛載的session對(duì)象,除了有你添加的內(nèi)容外,還有默認(rèn)的方法存在:

req.session.regenerate(function(err) {
 // 調(diào)用這個(gè)方法從新生成一個(gè)新的會(huì)話,完成后觸發(fā)
})
req.session.destroy(function(err) {
 // 刪除這個(gè)會(huì)話,完成后觸發(fā)
})
req.session.reload(function(err) {
 // 從新加載session數(shù)據(jù),完成后觸發(fā)回調(diào)
})
req.session.save(function(err) {
 // 使用當(dāng)前內(nèi)存中的數(shù)據(jù)保存到儲(chǔ)存器中
 // 默認(rèn)在會(huì)話結(jié)束的時(shí)候就會(huì)自動(dòng)調(diào)用這個(gè)方法
})
req.session.touch() // 更新cookie中的maxAge,一般不需要手動(dòng)操作,交由中間件

屬性

同樣的在session實(shí)例上也有很多屬性:

req.session.id // 保存唯一的會(huì)話id值,不可修改
req.session.cookie // 以鍵值對(duì)的形式保存cookie的原始數(shù)據(jù)
req.session.cookie.maxAge // 以毫秒的形式返回剩余存活時(shí)間
req.sessionID // 保存唯一的會(huì)話id,只讀

一個(gè)簡(jiǎn)單的例子

一個(gè)簡(jiǎn)單的登錄例子:

const express = require('express');
const app = new express();
const expressSession = require('express-session');
const userDb = new Map();
app.use(expressSession({
  secret:'hello world',
  saveUninitialized:true,
  resave:false,
  cookie:{
    maxAge:1800000
  },
  rolling:true,
}));


app.get('/login', (request, response) => {

  const
    id = request.query.id,
    pwd = request.query.pwd;

  if(id && pwd){

    if(userDb.has(id+pwd)){

      response.send('該用戶已登錄');

    }else{

      request.session.userId = id+pwd;
      userDb.set(id+pwd,id);
      response.redirect('/');

    }

  }else{
    response.send('請(qǐng)輸入正確的帳號(hào)和密碼');
  }

});

app.get('/logout',(request, response)=>{

  const userId = request.session.userId;

  request.session.destroy((err)=>{

    if(err || !userDb.has(userId)){
      response.send('登出失敗');
    }else{
      userDb.delete(userId);
      response.send('登出成功');
    }

  });

});

app.get('/',(request, response)=>{
  if(request.session.userId && userDb.has(request.session.userId)){
    response.send(`歡迎回來(lái)${userDb.get(request.session.userId)}`);
  }else{

    response.send('還未登錄');
  }
});

app.use((request, response) => {
  response.send('404 not found');
});
app.listen(8888, '127.0.0.1');

在瀏覽器中依次輸入以下url來(lái)模擬登錄行為:

localhost:8888/
localhost:8888/login?id=ASCll&pwd=123456
localhost:8888/
localhost:8888/logout
localhost:8888/

暗坑

我在chrome瀏覽器下運(yùn)行上面的例子多次后發(fā)現(xiàn)一個(gè)問(wèn)題,瀏覽器會(huì)進(jìn)行預(yù)讀取網(wǎng)頁(yè)來(lái)提高性能,也就是說(shuō)在瀏覽器中當(dāng)我url輸入到如下的地方時(shí):

localhost:8888/logo

根據(jù)我之間多次進(jìn)入這個(gè)頁(yè)面瀏覽器會(huì)提前訪問(wèn)這個(gè)頁(yè)面localhost:8888/logout,而導(dǎo)致服務(wù)器直接刪除session等到真正進(jìn)入到頁(yè)面的時(shí)候已經(jīng)是第二次加載頁(yè)面了,導(dǎo)致每次登出都顯示失敗.

希望有經(jīng)驗(yàn)的朋友能給出一個(gè)合理的解決方案.

注意

當(dāng)express-sessioncookie-parser一起使用的時(shí)候?qū)τ?code>cookie的簽名必須一致.

express-session的存儲(chǔ)實(shí)例是可以更換的,默認(rèn)使用MemoryStore只適合于測(cè)試和開發(fā)使用,生產(chǎn)環(huán)境必須要使用其他的儲(chǔ)存實(shí)例,否則會(huì)出現(xiàn)內(nèi)存碎片問(wèn)題,在官方文檔中給出了已經(jīng)實(shí)現(xiàn)的接口,可以對(duì)接redis以及mongodb等數(shù)據(jù)庫(kù).

該列表在官方文檔的最后:

npm地址

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • nodejs的10個(gè)性能優(yōu)化技巧

    nodejs的10個(gè)性能優(yōu)化技巧

    在我接觸JavaScript(無(wú)論瀏覽器還是NodeJS)的時(shí)間里,總是遇到有朋友有多線程的需求。而在NodeJS方面,有朋友甚至直接說(shuō)到,NodeJS是單線程的,無(wú)法很好的利用多核CPU。那么我們?cè)谑褂眠^(guò)程中,就要非常注意性能優(yōu)化了
    2014-07-07
  • node.JS路徑解析之PATH模塊使用方法詳解

    node.JS路徑解析之PATH模塊使用方法詳解

    path模塊包含一系列處理和轉(zhuǎn)換文件路徑的工具集,通過(guò) require('path') 可用來(lái)訪問(wèn)這個(gè)模塊。本文將詳細(xì)介紹path模塊
    2020-02-02
  • NodeJS http模塊用法示例【創(chuàng)建web服務(wù)器/客戶端】

    NodeJS http模塊用法示例【創(chuàng)建web服務(wù)器/客戶端】

    這篇文章主要介紹了NodeJS http模塊用法,結(jié)合實(shí)例形式分析了node.js創(chuàng)建web服務(wù)器與客戶端,進(jìn)行HTTP通信的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線等解決辦法

    DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線等解決辦法

    這篇文章主要給大家介紹了關(guān)于DevEco?Studio設(shè)置Nodejs提示路徑只能包含英文、數(shù)字、下劃線等的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • nodeJS模塊簡(jiǎn)單用法示例

    nodeJS模塊簡(jiǎn)單用法示例

    這篇文章主要介紹了nodeJS模塊簡(jiǎn)單用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了nodejs模塊定義、引入、注冊(cè)、啟動(dòng)等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • 使用NodeJS對(duì)一個(gè)字符串加密的操作方法示例

    使用NodeJS對(duì)一個(gè)字符串加密的操作方法示例

    Node.js中的crypto模塊提供了多種加密算法,可以用來(lái)加密字符串,AES和RSA是其中兩種常用的算法,本文介紹如何使用NodeJS對(duì)一個(gè)字符串加密,感興趣的朋友一起看看吧
    2025-01-01
  • Nodejs Post請(qǐng)求報(bào)socket hang up錯(cuò)誤的解決辦法

    Nodejs Post請(qǐng)求報(bào)socket hang up錯(cuò)誤的解決辦法

    這篇文章主要介紹了Nodejs Post請(qǐng)求報(bào)socket hang up錯(cuò)誤的解決辦法,本文因少加了headers字段信息導(dǎo)致出現(xiàn)這個(gè)錯(cuò)誤,本文給出了一個(gè)完整的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-09-09
  • NodeJS的使用與NPM包管理器詳解

    NodeJS的使用與NPM包管理器詳解

    Node.js 是一個(gè)基于 Chrome V8 JavaScript 引擎 構(gòu)建的開源、跨平臺(tái)運(yùn)行時(shí)環(huán)境,這篇文章主要介紹了NodeJS的使用與NPM包管理器,需要的朋友可以參考下
    2025-04-04
  • nvm如何切換與管理node版本

    nvm如何切換與管理node版本

    這篇文章主要介紹了nvm如何切換與管理node版本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • node前端開發(fā)模板引擎Jade的入門

    node前端開發(fā)模板引擎Jade的入門

    這篇文章主要介紹了node前端開發(fā)模板引擎Jade的入門,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05

最新評(píng)論

大安市| 西城区| 奇台县| 余干县| 望都县| 那曲县| 大荔县| 高唐县| 军事| 屏东县| 内黄县| 吉安县| 汕头市| 内丘县| 城步| 濮阳市| 车致| 瓦房店市| 友谊县| 镇坪县| 临泉县| 罗平县| 普安县| 郯城县| 平阴县| 万州区| 日喀则市| 华蓥市| 湖南省| 醴陵市| 长治县| 卢氏县| 毕节市| 内江市| 朝阳市| 白水县| 上林县| 太和县| 沾益县| 巴楚县| 双辽市|