express cookie-parser 小書

ASCll發表於2019-02-16

簡介

cookie-parser是Express最常使用的中介軟體,實際上雖然他名義上是一箇中介軟體但是實際上已經儼然成為了Express的一個不可或缺的部分.

在Express4的文件中,操作Cookie的部分就一個方法和一個屬性.但是實際上如果你不使用cookie-parser中介軟體這些方法是根本就不存在的.

先從Express操作cookie說起

如果有一個純淨的Express,像這樣:

const app = new express();
app.get(`/login`, (request, response) => {

    response.send(`hello express`);

});
app.listen(8888, `127.0.0.1`);

我們如何操縱cookie?,顯然只能在requestresponse中操縱.

express在request提供了:

  • cookies {Object}

response提供了:

  • res.cookie(name, value [, options])

簡單來講一個用於獲取另外一個用於寫入.

但是一切的前提就是你得使用cookie-parser中介軟體的前提下才可以擁有這個屬性和方法,之前我就被坑了.

在上面的極簡例項中我們得使用:

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

    console.log(request.headers.cookie);
    response.send(`hello express`);

});

才可以獲取沒有使用cookie-parser中介軟體時候的cookie.

cookie-parser的具體功能

  • 已鍵值對的形式的獲取cookie
  • 使用簡單的方法設定cookie
  • 對於cookie進行簽名

呼叫引數

cookie-parser在初始化的時候和寫入cookie的時候允許傳入引數.

在初始化的時候允許傳入:

引數 型別 描述
secret string string[] 用於簽名cookie的字串
options object 選項基於cookie模組

cookie方法引數

基本格式如下res.cookie(name, value [, options]).

其中第一個引數是name是cookie的鍵,而value是鍵對應的的值.

options有如下的選項,基本都是cookie在HttpHeader中的引數:

引數 型別 描述
domain string 描述cookie作用的主機
path stirng 只有在匹配成功的地址才會傳送cookie預設 /
encode function 用於cookie的編碼預設是encodeURIComponent
expires date 使用GMT格式的時間來指定過期時間
maxAge number 指定多好毫秒後cookie失效
httpOnly boolean 設定後客戶端無法訪問cookie的內容
secure boolean 標記這個cookie只有在https協議下起作用
signed boolean 對於cookie進行簽名
sameSite boolean 阻止cookie在跨站請求的時候傳送

在MDN中有cookie的詳細解釋,上面除了signed外都有介紹.

https://developer.mozilla.org…

使用示例

基本示例:

const express = require(`express`);
const cookieParse = require(`cookie-parser`);

const app = new express();

app.use(cookieParse());

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

    // 以鍵值對的形式獲取所有的cookie
    console.log(reqeust.cookies);
    
    // 寫入cookie
    response.cookie(`key`, `value`);

    response.send(`hello express`);

});

app.listen(8888, `127.0.0.1`);

使用cookie簽名:

const express = require(`express`);
const cookieParse = require(`cookie-parser`);

const app = new express();

// 傳入一個字串對cookie進行簽名
app.use(cookieParse(`hello world`));

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

    // 獲取沒有簽名的cookie
    console.log(request.cookies);
    // 獲取簽名的cookie
    console.log(request.signedCookies);
    
    // 寫入簽名cookie
    response.cookie(`signed`, `true`, {maxAge: 100000,signed:true});
    
    // 寫入未簽名cookie
    response.cookie(`key`, `value`);
    
    
    response.send(`hello express`);

});

app.listen(8888, `127.0.0.1`);

相關文章