這在express-session源代碼中是什么意思:
function setcookie(res, name, val, secret, options) {
var signed = 's:' signature.sign(val, secret);
var data = cookie.serialize(name, signed, options);
var prev = res.getHeader('Set-Cookie') || [] 。
var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];
res.setHeader('Set-Cookie', header)
}
具體而言:
var prev = res.getHeader('Set-Cookie') || []
var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];
什么時候會出現這樣的情況:你已經把cookie寫到了回應頭中,然后需要把它變成某種陣列?這里發生了什么,以及為什么?
uj5u.com熱心網友回復:
在同一個回應中可以有多個Set-Cookie頭存在。 而且,res.setHeader(name, data)接受一個陣列來表示資料,以便為同一個頭指定多個重復值。
因此,為了 "添加 "另一個頭,這段代碼獲得了當前頭的值(如果有的話)。 如果該值已經是一個陣列,那么它只是將新值添加到該陣列中。 如果它不是一個陣列(例如,只有一個單一的值),那么它將現有的值和新的值放入一個陣列,并呼叫res.setHeader(name, data),其中data現在是一個值的陣列。
這一點是必須的,因為res.setHeader()當為一個特定的名字呼叫時,并沒有為該名字 "添加 "一個新的值--相反,它替換了任何帶有該名字的現有值。 因此,為了添加一個新的值,它必須獲得現有的值,確保它們是在一個陣列中,將新的值添加到陣列中,然后將新的值設定為陣列。
因此,這一行:
var prev = res.getHeader('Set-Cookie') || [] 。
在沒有 "Set-Cookie "頭的情況下,使默認值成為一個空陣列。
然后,這一行:
var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];
檢查我們剛剛得到的值是否已經是一個陣列。 如果是,它將新的值并入該陣列。 如果不是(它一定是一個單一的值),它就會把之前的單一值和新的值合并成一個陣列。 因此,所有的代碼路徑都有一個陣列,新值在陣列的末尾,任何先前的值都在陣列的開頭。 然后,它可以使用該陣列呼叫res.setHeader(),并使用先前的值和任何新值的組合來替換所有先前的值。
這段代碼將在這樣的情況下投入使用:
res.setHeader('Set-Cookie', 'color=blue')。
res.setHeader('Set-Cookie', 'shape=square');
這段代碼的結果是,Set-Cookie將有兩個值'color=blue'和'shape=square'。 而且,當回應被實際發送時,它將構建兩個單獨的Set-Cookie頭資訊,每個都有這些值之一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/319180.html
標籤:
