簡介
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?,顯然只能在request
和response
中操縱.
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
外都有介紹.
使用示例
基本示例:
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`);