ここでの回答が無視している質問のこの部分を繰り返します。
サードパーティのlibを取り込む必要なしに、それを数行のコードで実行できますか?
クッキーを読む
Cookieは、Cookie
ヘッダー付きのリクエストから読み取られます。彼らは含まname
とvalue
。パスが機能するため、同じ名前の複数のCookieを送信できます。NodeJSでは、すべてのCookieはCookie
ヘッダーで送信されるときに1つの文字列として格納されます。で分割します;
。Cookieを取得すると、(存在する場合)イコールの左側にあるname
すべてがになり、その後にあるすべてがになりvalue
ます。一部のブラウザは、等号のないCookieを受け入れ、名前を空白と見なします。空白はCookieの一部としてカウントされません。値は二重引用符("
)で囲むこともできます。値にはも含めることができます=
。たとえば、formula=5+3=8
は有効なCookieです。
/**
* @param {string} [cookieString='']
* @return {[string,string][]} String Tuple
*/
function getEntriesFromCookie(cookieString = '') {
return cookieString.split(';').map((pair) => {
const indexOfEquals = pair.indexOf('=');
let name;
let value;
if (indexOfEquals === -1) {
name = '';
value = pair.trim();
} else {
name = pair.substr(0, indexOfEquals).trim();
value = pair.substr(indexOfEquals + 1).trim();
}
const firstQuote = value.indexOf('"');
const lastQuote = value.lastIndexOf('"');
if (firstQuote !== -1 && lastQuote !== -1) {
value = value.substring(firstQuote + 1, lastQuote);
}
return [name, value];
});
}
const cookieEntries = getEntriesFromCookie(request.headers.Cookie);
const object = Object.fromEntries(cookieEntries.slice().reverse());
重複した名前を想定していない場合は、オブジェクトに変換することで、物事を簡単に行うことができます。次にobject.myCookieName
、値を取得するようにアクセスできます。重複が予想される場合は、を反復処理する必要がありますcookieEntries
。ブラウザーは降順の優先順位でCookieをフィードするため、逆にすると、優先順位の最も高いCookieがオブジェクトに表示されます。(これ.slice()
は、配列の変異を避けるためです。)
設定クッキー
「書き込み」CookieはSet-Cookie
、応答のヘッダーを使用して行われます。response.headers['Set-Cookie']
オブジェクトは実際には配列ですので、あなたがそれにプッシュされます。文字列を受け入れますがname
、and だけではなく、より多くの値を持っていますvalue
。最も難しい部分は文字列を書き込むことですが、これは1行で行うことができます。
/**
* @param {Object} options
* @param {string} [options.name='']
* @param {string} [options.value='']
* @param {Date} [options.expires]
* @param {number} [options.maxAge]
* @param {string} [options.domain]
* @param {string} [options.path]
* @param {boolean} [options.secure]
* @param {boolean} [options.httpOnly]
* @param {'Strict'|'Lax'|'None'} [options.sameSite]
* @return {string}
*/
function createSetCookie(options) {
return (`${options.name || ''}=${options.value || ''}`)
+ (options.expires != null ? `; Expires=${options.expires.toUTCString()}` : '')
+ (options.maxAge != null ? `; Max-Age=${options.maxAge}` : '')
+ (options.domain != null ? `; Domain=${options.domain}` : '')
+ (options.path != null ? `; Path=${options.path}` : '')
+ (options.secure ? '; Secure' : '')
+ (options.httpOnly ? '; HttpOnly' : '')
+ (options.sameSite != null ? `; SameSite=${options.sameSite}` : '');
}
const newCookie = createSetCookie({
name: 'cookieName',
value: 'cookieValue',
path:'/',
});
response.headers['Set-Cookie'].push(newCookie);
実際にはSet-Cookie
リクエストに複数のヘッダーを設定できるため、複数のCookieを設定できることに注意してください。それが配列である理由です。
外部ライブラリに関する注意:
、、またはを使用する場合はexpress
、非標準のデフォルトがあることに注意してください。解析されるCookieは常にURIデコード(パーセントデコード)されます。これは、次の文字のいずれかを含む名前または値を使用する場合を意味します。これらのライブラリでは、それらの扱いが異なります。Cookieを設定する場合、Cookieはでエンコードされます。そして、もしあなたがクッキーを読んでいるなら、あなたはそれらをデコードしなければなりません。cookie-parser
cookie
!#$%&'()*+/:<=>?@[]^`{|}
%{HEX}
たとえば、email=name@domain.com
は有効なCookieですが、これらのライブラリはそれをとしてエンコードしますemail=name%40domain.com
。%
Cookieでを使用している場合、デコードで問題が発生する可能性があります。壊されてしまいます。たとえば、以前のCookieはにsecretagentlevel=50%007and50%006
なりsecretagentlevel=507and506
ます。これはエッジケースですが、ライブラリを切り替える場合に注意する必要があります。
また、これらのライブラリでは、Cookieはデフォルトpath=/
で設定されています。つまり、ホストへのすべてのURLリクエストでCookie が送信されます。
これらの値を自分でエンコードまたはデコードする場合は、encodeURIComponent
またはdecodeURIComponent
をそれぞれ使用できます。
参照:
追加情報:
=
、FacebookのCookieのように、Cookieの値に等号()が含まれていると正しく機能しませんfbm_1234123412341234=base_domain=.domain.com
。