root / HServer / 00.Server / 00.Program / node_modules / express-session / README.md
이력 | 보기 | 이력해설 | 다운로드 (31.4 KB)
| 1 | 39 | HKM | # express-session |
|---|---|---|---|
| 2 | |||
| 3 | [![NPM Version][npm-image]][npm-url] |
||
| 4 | [![NPM Downloads][downloads-image]][downloads-url] |
||
| 5 | [![Build Status][travis-image]][travis-url] |
||
| 6 | [![Test Coverage][coveralls-image]][coveralls-url] |
||
| 7 | [![Gratipay][gratipay-image]][gratipay-url] |
||
| 8 | |||
| 9 | ## Installation |
||
| 10 | |||
| 11 | This is a [Node.js](https://nodejs.org/en/) module available through the |
||
| 12 | [npm registry](https://www.npmjs.com/). Installation is done using the |
||
| 13 | [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): |
||
| 14 | |||
| 15 | ```sh |
||
| 16 | $ npm install express-session |
||
| 17 | ``` |
||
| 18 | |||
| 19 | ## API |
||
| 20 | |||
| 21 | ```js |
||
| 22 | var session = require('express-session')
|
||
| 23 | ``` |
||
| 24 | |||
| 25 | ### session(options) |
||
| 26 | |||
| 27 | Create a session middleware with the given `options`. |
||
| 28 | |||
| 29 | **Note** Session data is _not_ saved in the cookie itself, just the session ID. |
||
| 30 | Session data is stored server-side. |
||
| 31 | |||
| 32 | **Note** Since version 1.5.0, the [`cookie-parser` middleware](https://www.npmjs.com/package/cookie-parser) |
||
| 33 | no longer needs to be used for this module to work. This module now directly reads |
||
| 34 | and writes cookies on `req`/`res`. Using `cookie-parser` may result in issues |
||
| 35 | if the `secret` is not the same between this module and `cookie-parser`. |
||
| 36 | |||
| 37 | **Warning** The default server-side session storage, `MemoryStore`, is _purposely_ |
||
| 38 | not designed for a production environment. It will leak memory under most |
||
| 39 | conditions, does not scale past a single process, and is meant for debugging and |
||
| 40 | developing. |
||
| 41 | |||
| 42 | For a list of stores, see [compatible session stores](#compatible-session-stores). |
||
| 43 | |||
| 44 | #### Options |
||
| 45 | |||
| 46 | `express-session` accepts these properties in the options object. |
||
| 47 | |||
| 48 | ##### cookie |
||
| 49 | |||
| 50 | Settings object for the session ID cookie. The default value is |
||
| 51 | `{ path: '/', httpOnly: true, secure: false, maxAge: null }`.
|
||
| 52 | |||
| 53 | The following are options that can be set in this object. |
||
| 54 | |||
| 55 | ##### cookie.domain |
||
| 56 | |||
| 57 | Specifies the value for the `Domain` `Set-Cookie` attribute. By default, no domain |
||
| 58 | is set, and most clients will consider the cookie to apply to only the current |
||
| 59 | domain. |
||
| 60 | |||
| 61 | ##### cookie.expires |
||
| 62 | |||
| 63 | Specifies the `Date` object to be the value for the `Expires` `Set-Cookie` attribute. |
||
| 64 | By default, no expiration is set, and most clients will consider this a |
||
| 65 | "non-persistent cookie" and will delete it on a condition like exiting a web browser |
||
| 66 | application. |
||
| 67 | |||
| 68 | **Note** If both `expires` and `maxAge` are set in the options, then the last one |
||
| 69 | defined in the object is what is used. |
||
| 70 | |||
| 71 | **Note** The `expires` option should not be set directly; instead only use the `maxAge` |
||
| 72 | option. |
||
| 73 | |||
| 74 | ##### cookie.httpOnly |
||
| 75 | |||
| 76 | Specifies the `boolean` value for the `HttpOnly` `Set-Cookie` attribute. When truthy, |
||
| 77 | the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly` |
||
| 78 | attribute is set. |
||
| 79 | |||
| 80 | **Note** be careful when setting this to `true`, as compliant clients will not allow |
||
| 81 | client-side JavaScript to see the cookie in `document.cookie`. |
||
| 82 | |||
| 83 | ##### cookie.maxAge |
||
| 84 | |||
| 85 | Specifies the `number` (in milliseconds) to use when calculating the `Expires` |
||
| 86 | `Set-Cookie` attribute. This is done by taking the current server time and adding |
||
| 87 | `maxAge` milliseconds to the value to calculate an `Expires` datetime. By default, |
||
| 88 | no maximum age is set. |
||
| 89 | |||
| 90 | **Note** If both `expires` and `maxAge` are set in the options, then the last one |
||
| 91 | defined in the object is what is used. |
||
| 92 | |||
| 93 | ##### cookie.path |
||
| 94 | |||
| 95 | Specifies the value for the `Path` `Set-Cookie`. By default, this is set to `'/'`, which |
||
| 96 | is the root path of the domain. |
||
| 97 | |||
| 98 | ##### cookie.sameSite |
||
| 99 | |||
| 100 | Specifies the `boolean` or `string` to be the value for the `SameSite` `Set-Cookie` attribute. |
||
| 101 | |||
| 102 | - `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement. |
||
| 103 | - `false` will not set the `SameSite` attribute. |
||
| 104 | - `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement. |
||
| 105 | - `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement. |
||
| 106 | |||
| 107 | More information about the different enforcement levels can be found in the specification |
||
| 108 | https://tools.ietf.org/html/draft-west-first-party-cookies-07#section-4.1.1 |
||
| 109 | |||
| 110 | **Note** This is an attribute that has not yet been fully standardized, and may change in |
||
| 111 | the future. This also means many clients may ignore this attribute until they understand it. |
||
| 112 | |||
| 113 | ##### cookie.secure |
||
| 114 | |||
| 115 | Specifies the `boolean` value for the `Secure` `Set-Cookie` attribute. When truthy, |
||
| 116 | the `Secure` attribute is set, otherwise it is not. By default, the `Secure` |
||
| 117 | attribute is not set. |
||
| 118 | |||
| 119 | **Note** be careful when setting this to `true`, as compliant clients will not send |
||
| 120 | the cookie back to the server in the future if the browser does not have an HTTPS |
||
| 121 | connection. |
||
| 122 | |||
| 123 | Please note that `secure: true` is a **recommended** option. However, it requires |
||
| 124 | an https-enabled website, i.e., HTTPS is necessary for secure cookies. If `secure` |
||
| 125 | is set, and you access your site over HTTP, the cookie will not be set. If you |
||
| 126 | have your node.js behind a proxy and are using `secure: true`, you need to set |
||
| 127 | "trust proxy" in express: |
||
| 128 | |||
| 129 | ```js |
||
| 130 | var app = express() |
||
| 131 | app.set('trust proxy', 1) // trust first proxy
|
||
| 132 | app.use(session({
|
||
| 133 | secret: 'keyboard cat', |
||
| 134 | resave: false, |
||
| 135 | saveUninitialized: true, |
||
| 136 | cookie: { secure: true }
|
||
| 137 | })) |
||
| 138 | ``` |
||
| 139 | |||
| 140 | For using secure cookies in production, but allowing for testing in development, |
||
| 141 | the following is an example of enabling this setup based on `NODE_ENV` in express: |
||
| 142 | |||
| 143 | ```js |
||
| 144 | var app = express() |
||
| 145 | var sess = {
|
||
| 146 | secret: 'keyboard cat', |
||
| 147 | cookie: {}
|
||
| 148 | } |
||
| 149 | |||
| 150 | if (app.get('env') === 'production') {
|
||
| 151 | app.set('trust proxy', 1) // trust first proxy
|
||
| 152 | sess.cookie.secure = true // serve secure cookies |
||
| 153 | } |
||
| 154 | |||
| 155 | app.use(session(sess)) |
||
| 156 | ``` |
||
| 157 | |||
| 158 | The `cookie.secure` option can also be set to the special value `'auto'` to have |
||
| 159 | this setting automatically match the determined security of the connection. Be |
||
| 160 | careful when using this setting if the site is available both as HTTP and HTTPS, |
||
| 161 | as once the cookie is set on HTTPS, it will no longer be visible over HTTP. This |
||
| 162 | is useful when the Express `"trust proxy"` setting is properly setup to simplify |
||
| 163 | development vs production configuration. |
||
| 164 | |||
| 165 | ##### genid |
||
| 166 | |||
| 167 | Function to call to generate a new session ID. Provide a function that returns |
||
| 168 | a string that will be used as a session ID. The function is given `req` as the |
||
| 169 | first argument if you want to use some value attached to `req` when generating |
||
| 170 | the ID. |
||
| 171 | |||
| 172 | The default value is a function which uses the `uid-safe` library to generate IDs. |
||
| 173 | |||
| 174 | **NOTE** be careful to generate unique IDs so your sessions do not conflict. |
||
| 175 | |||
| 176 | ```js |
||
| 177 | app.use(session({
|
||
| 178 | genid: function(req) {
|
||
| 179 | return genuuid() // use UUIDs for session IDs |
||
| 180 | }, |
||
| 181 | secret: 'keyboard cat' |
||
| 182 | })) |
||
| 183 | ``` |
||
| 184 | |||
| 185 | ##### name |
||
| 186 | |||
| 187 | The name of the session ID cookie to set in the response (and read from in the |
||
| 188 | request). |
||
| 189 | |||
| 190 | The default value is `'connect.sid'`. |
||
| 191 | |||
| 192 | **Note** if you have multiple apps running on the same hostname (this is just |
||
| 193 | the name, i.e. `localhost` or `127.0.0.1`; different schemes and ports do not |
||
| 194 | name a different hostname), then you need to separate the session cookies from |
||
| 195 | each other. The simplest method is to simply set different `name`s per app. |
||
| 196 | |||
| 197 | ##### proxy |
||
| 198 | |||
| 199 | Trust the reverse proxy when setting secure cookies (via the "X-Forwarded-Proto" |
||
| 200 | header). |
||
| 201 | |||
| 202 | The default value is `undefined`. |
||
| 203 | |||
| 204 | - `true` The "X-Forwarded-Proto" header will be used. |
||
| 205 | - `false` All headers are ignored and the connection is considered secure only |
||
| 206 | if there is a direct TLS/SSL connection. |
||
| 207 | - `undefined` Uses the "trust proxy" setting from express |
||
| 208 | |||
| 209 | ##### resave |
||
| 210 | |||
| 211 | Forces the session to be saved back to the session store, even if the session |
||
| 212 | was never modified during the request. Depending on your store this may be |
||
| 213 | necessary, but it can also create race conditions where a client makes two |
||
| 214 | parallel requests to your server and changes made to the session in one |
||
| 215 | request may get overwritten when the other request ends, even if it made no |
||
| 216 | changes (this behavior also depends on what store you're using). |
||
| 217 | |||
| 218 | The default value is `true`, but using the default has been deprecated, |
||
| 219 | as the default will change in the future. Please research into this setting |
||
| 220 | and choose what is appropriate to your use-case. Typically, you'll want |
||
| 221 | `false`. |
||
| 222 | |||
| 223 | How do I know if this is necessary for my store? The best way to know is to |
||
| 224 | check with your store if it implements the `touch` method. If it does, then |
||
| 225 | you can safely set `resave: false`. If it does not implement the `touch` |
||
| 226 | method and your store sets an expiration date on stored sessions, then you |
||
| 227 | likely need `resave: true`. |
||
| 228 | |||
| 229 | ##### rolling |
||
| 230 | |||
| 231 | Force a session identifier cookie to be set on every response. The expiration |
||
| 232 | is reset to the original [`maxAge`](#cookiemaxage), resetting the expiration |
||
| 233 | countdown. |
||
| 234 | |||
| 235 | The default value is `false`. |
||
| 236 | |||
| 237 | **Note** When this option is set to `true` but the `saveUninitialized` option is |
||
| 238 | set to `false`, the cookie will not be set on a response with an uninitialized |
||
| 239 | session. |
||
| 240 | |||
| 241 | ##### saveUninitialized |
||
| 242 | |||
| 243 | Forces a session that is "uninitialized" to be saved to the store. A session is |
||
| 244 | uninitialized when it is new but not modified. Choosing `false` is useful for |
||
| 245 | implementing login sessions, reducing server storage usage, or complying with |
||
| 246 | laws that require permission before setting a cookie. Choosing `false` will also |
||
| 247 | help with race conditions where a client makes multiple parallel requests |
||
| 248 | without a session. |
||
| 249 | |||
| 250 | The default value is `true`, but using the default has been deprecated, as the |
||
| 251 | default will change in the future. Please research into this setting and |
||
| 252 | choose what is appropriate to your use-case. |
||
| 253 | |||
| 254 | **Note** if you are using Session in conjunction with PassportJS, Passport |
||
| 255 | will add an empty Passport object to the session for use after a user is |
||
| 256 | authenticated, which will be treated as a modification to the session, causing |
||
| 257 | it to be saved. *This has been fixed in PassportJS 0.3.0* |
||
| 258 | |||
| 259 | ##### secret |
||
| 260 | |||
| 261 | **Required option** |
||
| 262 | |||
| 263 | This is the secret used to sign the session ID cookie. This can be either a string |
||
| 264 | for a single secret, or an array of multiple secrets. If an array of secrets is |
||
| 265 | provided, only the first element will be used to sign the session ID cookie, while |
||
| 266 | all the elements will be considered when verifying the signature in requests. |
||
| 267 | |||
| 268 | ##### store |
||
| 269 | |||
| 270 | The session store instance, defaults to a new `MemoryStore` instance. |
||
| 271 | |||
| 272 | ##### unset |
||
| 273 | |||
| 274 | Control the result of unsetting `req.session` (through `delete`, setting to `null`, |
||
| 275 | etc.). |
||
| 276 | |||
| 277 | The default value is `'keep'`. |
||
| 278 | |||
| 279 | - `'destroy'` The session will be destroyed (deleted) when the response ends. |
||
| 280 | - `'keep'` The session in the store will be kept, but modifications made during |
||
| 281 | the request are ignored and not saved. |
||
| 282 | |||
| 283 | ### req.session |
||
| 284 | |||
| 285 | To store or access session data, simply use the request property `req.session`, |
||
| 286 | which is (generally) serialized as JSON by the store, so nested objects |
||
| 287 | are typically fine. For example below is a user-specific view counter: |
||
| 288 | |||
| 289 | ```js |
||
| 290 | // Use the session middleware |
||
| 291 | app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
|
||
| 292 | |||
| 293 | // Access the session as req.session |
||
| 294 | app.get('/', function(req, res, next) {
|
||
| 295 | if (req.session.views) {
|
||
| 296 | req.session.views++ |
||
| 297 | res.setHeader('Content-Type', 'text/html')
|
||
| 298 | res.write('<p>views: ' + req.session.views + '</p>')
|
||
| 299 | res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>')
|
||
| 300 | res.end() |
||
| 301 | } else {
|
||
| 302 | req.session.views = 1 |
||
| 303 | res.end('welcome to the session demo. refresh!')
|
||
| 304 | } |
||
| 305 | }) |
||
| 306 | ``` |
||
| 307 | |||
| 308 | #### Session.regenerate(callback) |
||
| 309 | |||
| 310 | To regenerate the session simply invoke the method. Once complete, |
||
| 311 | a new SID and `Session` instance will be initialized at `req.session` |
||
| 312 | and the `callback` will be invoked. |
||
| 313 | |||
| 314 | ```js |
||
| 315 | req.session.regenerate(function(err) {
|
||
| 316 | // will have a new session here |
||
| 317 | }) |
||
| 318 | ``` |
||
| 319 | |||
| 320 | #### Session.destroy(callback) |
||
| 321 | |||
| 322 | Destroys the session and will unset the `req.session` property. |
||
| 323 | Once complete, the `callback` will be invoked. |
||
| 324 | |||
| 325 | ```js |
||
| 326 | req.session.destroy(function(err) {
|
||
| 327 | // cannot access session here |
||
| 328 | }) |
||
| 329 | ``` |
||
| 330 | |||
| 331 | #### Session.reload(callback) |
||
| 332 | |||
| 333 | Reloads the session data from the store and re-populates the |
||
| 334 | `req.session` object. Once complete, the `callback` will be invoked. |
||
| 335 | |||
| 336 | ```js |
||
| 337 | req.session.reload(function(err) {
|
||
| 338 | // session updated |
||
| 339 | }) |
||
| 340 | ``` |
||
| 341 | |||
| 342 | #### Session.save(callback) |
||
| 343 | |||
| 344 | Save the session back to the store, replacing the contents on the store with the |
||
| 345 | contents in memory (though a store may do something else--consult the store's |
||
| 346 | documentation for exact behavior). |
||
| 347 | |||
| 348 | This method is automatically called at the end of the HTTP response if the |
||
| 349 | session data has been altered (though this behavior can be altered with various |
||
| 350 | options in the middleware constructor). Because of this, typically this method |
||
| 351 | does not need to be called. |
||
| 352 | |||
| 353 | There are some cases where it is useful to call this method, for example, |
||
| 354 | redirects, long-lived requests or in WebSockets. |
||
| 355 | |||
| 356 | ```js |
||
| 357 | req.session.save(function(err) {
|
||
| 358 | // session saved |
||
| 359 | }) |
||
| 360 | ``` |
||
| 361 | |||
| 362 | #### Session.touch() |
||
| 363 | |||
| 364 | Updates the `.maxAge` property. Typically this is |
||
| 365 | not necessary to call, as the session middleware does this for you. |
||
| 366 | |||
| 367 | ### req.session.id |
||
| 368 | |||
| 369 | Each session has a unique ID associated with it. This property is an |
||
| 370 | alias of [`req.sessionID`](#reqsessionid-1) and cannot be modified. |
||
| 371 | It has been added to make the session ID accessible from the `session` |
||
| 372 | object. |
||
| 373 | |||
| 374 | ### req.session.cookie |
||
| 375 | |||
| 376 | Each session has a unique cookie object accompany it. This allows |
||
| 377 | you to alter the session cookie per visitor. For example we can |
||
| 378 | set `req.session.cookie.expires` to `false` to enable the cookie |
||
| 379 | to remain for only the duration of the user-agent. |
||
| 380 | |||
| 381 | #### Cookie.maxAge |
||
| 382 | |||
| 383 | Alternatively `req.session.cookie.maxAge` will return the time |
||
| 384 | remaining in milliseconds, which we may also re-assign a new value |
||
| 385 | to adjust the `.expires` property appropriately. The following |
||
| 386 | are essentially equivalent |
||
| 387 | |||
| 388 | ```js |
||
| 389 | var hour = 3600000 |
||
| 390 | req.session.cookie.expires = new Date(Date.now() + hour) |
||
| 391 | req.session.cookie.maxAge = hour |
||
| 392 | ``` |
||
| 393 | |||
| 394 | For example when `maxAge` is set to `60000` (one minute), and 30 seconds |
||
| 395 | has elapsed it will return `30000` until the current request has completed, |
||
| 396 | at which time `req.session.touch()` is called to reset `req.session.maxAge` |
||
| 397 | to its original value. |
||
| 398 | |||
| 399 | ```js |
||
| 400 | req.session.cookie.maxAge // => 30000 |
||
| 401 | ``` |
||
| 402 | |||
| 403 | ### req.sessionID |
||
| 404 | |||
| 405 | To get the ID of the loaded session, access the request property |
||
| 406 | `req.sessionID`. This is simply a read-only value set when a session |
||
| 407 | is loaded/created. |
||
| 408 | |||
| 409 | ## Session Store Implementation |
||
| 410 | |||
| 411 | Every session store _must_ be an `EventEmitter` and implement specific |
||
| 412 | methods. The following methods are the list of **required**, **recommended**, |
||
| 413 | and **optional**. |
||
| 414 | |||
| 415 | * Required methods are ones that this module will always call on the store. |
||
| 416 | * Recommended methods are ones that this module will call on the store if |
||
| 417 | available. |
||
| 418 | * Optional methods are ones this module does not call at all, but helps |
||
| 419 | present uniform stores to users. |
||
| 420 | |||
| 421 | For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo. |
||
| 422 | |||
| 423 | ### store.all(callback) |
||
| 424 | |||
| 425 | **Optional** |
||
| 426 | |||
| 427 | This optional method is used to get all sessions in the store as an array. The |
||
| 428 | `callback` should be called as `callback(error, sessions)`. |
||
| 429 | |||
| 430 | ### store.destroy(sid, callback) |
||
| 431 | |||
| 432 | **Required** |
||
| 433 | |||
| 434 | This required method is used to destroy/delete a session from the store given |
||
| 435 | a session ID (`sid`). The `callback` should be called as `callback(error)` once |
||
| 436 | the session is destroyed. |
||
| 437 | |||
| 438 | ### store.clear(callback) |
||
| 439 | |||
| 440 | **Optional** |
||
| 441 | |||
| 442 | This optional method is used to delete all sessions from the store. The |
||
| 443 | `callback` should be called as `callback(error)` once the store is cleared. |
||
| 444 | |||
| 445 | ### store.length(callback) |
||
| 446 | |||
| 447 | **Optional** |
||
| 448 | |||
| 449 | This optional method is used to get the count of all sessions in the store. |
||
| 450 | The `callback` should be called as `callback(error, len)`. |
||
| 451 | |||
| 452 | ### store.get(sid, callback) |
||
| 453 | |||
| 454 | **Required** |
||
| 455 | |||
| 456 | This required method is used to get a session from the store given a session |
||
| 457 | ID (`sid`). The `callback` should be called as `callback(error, session)`. |
||
| 458 | |||
| 459 | The `session` argument should be a session if found, otherwise `null` or |
||
| 460 | `undefined` if the session was not found (and there was no error). A special |
||
| 461 | case is made when `error.code === 'ENOENT'` to act like `callback(null, null)`. |
||
| 462 | |||
| 463 | ### store.set(sid, session, callback) |
||
| 464 | |||
| 465 | **Required** |
||
| 466 | |||
| 467 | This required method is used to upsert a session into the store given a |
||
| 468 | session ID (`sid`) and session (`session`) object. The callback should be |
||
| 469 | called as `callback(error)` once the session has been set in the store. |
||
| 470 | |||
| 471 | ### store.touch(sid, session, callback) |
||
| 472 | |||
| 473 | **Recommended** |
||
| 474 | |||
| 475 | This recommended method is used to "touch" a given session given a |
||
| 476 | session ID (`sid`) and session (`session`) object. The `callback` should be |
||
| 477 | called as `callback(error)` once the session has been touched. |
||
| 478 | |||
| 479 | This is primarily used when the store will automatically delete idle sessions |
||
| 480 | and this method is used to signal to the store the given session is active, |
||
| 481 | potentially resetting the idle timer. |
||
| 482 | |||
| 483 | ## Compatible Session Stores |
||
| 484 | |||
| 485 | The following modules implement a session store that is compatible with this |
||
| 486 | module. Please make a PR to add additional modules :) |
||
| 487 | |||
| 488 | [![★][aerospike-session-store-image] aerospike-session-store][aerospike-session-store-url] A session store using [Aerospike](http://www.aerospike.com/). |
||
| 489 | |||
| 490 | [aerospike-session-store-url]: https://www.npmjs.com/package/aerospike-session-store |
||
| 491 | [aerospike-session-store-image]: https://img.shields.io/github/stars/aerospike/aerospike-session-store-expressjs.svg?label=%E2%98%85 |
||
| 492 | |||
| 493 | [![★][cassandra-store-image] cassandra-store][cassandra-store-url] An Apache Cassandra-based session store. |
||
| 494 | |||
| 495 | [cassandra-store-url]: https://www.npmjs.com/package/cassandra-store |
||
| 496 | [cassandra-store-image]: https://img.shields.io/github/stars/webcc/cassandra-store.svg?label=%E2%98%85 |
||
| 497 | |||
| 498 | [![★][cluster-store-image] cluster-store][cluster-store-url] A wrapper for using in-process / embedded |
||
| 499 | stores - such as SQLite (via knex), leveldb, files, or memory - with node cluster (desirable for Raspberry Pi 2 |
||
| 500 | and other multi-core embedded devices). |
||
| 501 | |||
| 502 | [cluster-store-url]: https://www.npmjs.com/package/cluster-store |
||
| 503 | [cluster-store-image]: https://img.shields.io/github/stars/coolaj86/cluster-store.svg?label=%E2%98%85 |
||
| 504 | |||
| 505 | [![★][connect-azuretables-image] connect-azuretables][connect-azuretables-url] An [Azure Table Storage](https://azure.microsoft.com/en-gb/services/storage/tables/)-based session store. |
||
| 506 | |||
| 507 | [connect-azuretables-url]: https://www.npmjs.com/package/connect-azuretables |
||
| 508 | [connect-azuretables-image]: https://img.shields.io/github/stars/mike-goodwin/connect-azuretables.svg?label=%E2%98%85 |
||
| 509 | |||
| 510 | [![★][connect-cloudant-store-image] connect-cloudant-store][connect-cloudant-store-url] An [IBM Cloudant](https://cloudant.com/)-based session store. |
||
| 511 | |||
| 512 | [connect-cloudant-store-url]: https://www.npmjs.com/package/connect-cloudant-store |
||
| 513 | [connect-cloudant-store-image]: https://img.shields.io/github/stars/adriantanasa/connect-cloudant-store.svg?label=%E2%98%85 |
||
| 514 | |||
| 515 | [![★][connect-couchbase-image] connect-couchbase][connect-couchbase-url] A [couchbase](http://www.couchbase.com/)-based session store. |
||
| 516 | |||
| 517 | [connect-couchbase-url]: https://www.npmjs.com/package/connect-couchbase |
||
| 518 | [connect-couchbase-image]: https://img.shields.io/github/stars/christophermina/connect-couchbase.svg?label=%E2%98%85 |
||
| 519 | |||
| 520 | [![★][connect-datacache-image] connect-datacache][connect-datacache-url] An [IBM Bluemix Data Cache](http://www.ibm.com/cloud-computing/bluemix/)-based session store. |
||
| 521 | |||
| 522 | [connect-datacache-url]: https://www.npmjs.com/package/connect-datacache |
||
| 523 | [connect-datacache-image]: https://img.shields.io/github/stars/adriantanasa/connect-datacache.svg?label=%E2%98%85 |
||
| 524 | |||
| 525 | [![★][connect-db2-image] connect-db2][connect-db2-url] An IBM DB2-based session store built using [ibm_db](https://www.npmjs.com/package/ibm_db) module. |
||
| 526 | |||
| 527 | [connect-db2-url]: https://www.npmjs.com/package/connect-db2 |
||
| 528 | [connect-db2-image]: https://img.shields.io/github/stars/wallali/connect-db2.svg?label=%E2%98%85 |
||
| 529 | |||
| 530 | [![★][connect-dynamodb-image] connect-dynamodb][connect-dynamodb-url] A DynamoDB-based session store. |
||
| 531 | |||
| 532 | [connect-dynamodb-url]: https://github.com/ca98am79/connect-dynamodb |
||
| 533 | [connect-dynamodb-image]: https://img.shields.io/github/stars/ca98am79/connect-dynamodb.svg?label=%E2%98%85 |
||
| 534 | |||
| 535 | [![★][connect-loki-image] connect-loki][connect-loki-url] A Loki.js-based session store. |
||
| 536 | |||
| 537 | [connect-loki-url]: https://www.npmjs.com/package/connect-loki |
||
| 538 | [connect-loki-image]: https://img.shields.io/github/stars/Requarks/connect-loki.svg?label=%E2%98%85 |
||
| 539 | |||
| 540 | [![★][connect-ml-image] connect-ml][connect-ml-url] A MarkLogic Server-based session store. |
||
| 541 | |||
| 542 | [connect-ml-url]: https://www.npmjs.com/package/connect-ml |
||
| 543 | [connect-ml-image]: https://img.shields.io/github/stars/bluetorch/connect-ml.svg?label=%E2%98%85 |
||
| 544 | |||
| 545 | [![★][connect-mssql-image] connect-mssql][connect-mssql-url] A SQL Server-based session store. |
||
| 546 | |||
| 547 | [connect-mssql-url]: https://www.npmjs.com/package/connect-mssql |
||
| 548 | [connect-mssql-image]: https://img.shields.io/github/stars/patriksimek/connect-mssql.svg?label=%E2%98%85 |
||
| 549 | |||
| 550 | [![★][connect-monetdb-image] connect-monetdb][connect-monetdb-url] A MonetDB-based session store. |
||
| 551 | |||
| 552 | [connect-monetdb-url]: https://www.npmjs.com/package/connect-monetdb |
||
| 553 | [connect-monetdb-image]: https://img.shields.io/github/stars/MonetDB/npm-connect-monetdb.svg?label=%E2%98%85 |
||
| 554 | |||
| 555 | [![★][connect-mongo-image] connect-mongo][connect-mongo-url] A MongoDB-based session store. |
||
| 556 | |||
| 557 | [connect-mongo-url]: https://www.npmjs.com/package/connect-mongo |
||
| 558 | [connect-mongo-image]: https://img.shields.io/github/stars/kcbanner/connect-mongo.svg?label=%E2%98%85 |
||
| 559 | |||
| 560 | [![★][connect-mongodb-session-image] connect-mongodb-session][connect-mongodb-session-url] Lightweight MongoDB-based session store built and maintained by MongoDB. |
||
| 561 | |||
| 562 | [connect-mongodb-session-url]: https://www.npmjs.com/package/connect-mongodb-session |
||
| 563 | [connect-mongodb-session-image]: https://img.shields.io/github/stars/mongodb-js/connect-mongodb-session.svg?label=%E2%98%85 |
||
| 564 | |||
| 565 | [![★][connect-pg-simple-image] connect-pg-simple][connect-pg-simple-url] A PostgreSQL-based session store. |
||
| 566 | |||
| 567 | [connect-pg-simple-url]: https://www.npmjs.com/package/connect-pg-simple |
||
| 568 | [connect-pg-simple-image]: https://img.shields.io/github/stars/voxpelli/node-connect-pg-simple.svg?label=%E2%98%85 |
||
| 569 | |||
| 570 | [![★][connect-redis-image] connect-redis][connect-redis-url] A Redis-based session store. |
||
| 571 | |||
| 572 | [connect-redis-url]: https://www.npmjs.com/package/connect-redis |
||
| 573 | [connect-redis-image]: https://img.shields.io/github/stars/tj/connect-redis.svg?label=%E2%98%85 |
||
| 574 | |||
| 575 | [![★][connect-memcached-image] connect-memcached][connect-memcached-url] A memcached-based session store. |
||
| 576 | |||
| 577 | [connect-memcached-url]: https://www.npmjs.com/package/connect-memcached |
||
| 578 | [connect-memcached-image]: https://img.shields.io/github/stars/balor/connect-memcached.svg?label=%E2%98%85 |
||
| 579 | |||
| 580 | [![★][connect-memjs-image] connect-memjs][connect-memjs-url] A memcached-based session store using |
||
| 581 | [memjs](https://www.npmjs.com/package/memjs) as the memcached client. |
||
| 582 | |||
| 583 | [connect-memjs-url]: https://www.npmjs.com/package/connect-memjs |
||
| 584 | [connect-memjs-image]: https://img.shields.io/github/stars/liamdon/connect-memjs.svg?label=%E2%98%85 |
||
| 585 | |||
| 586 | [![★][connect-session-knex-image] connect-session-knex][connect-session-knex-url] A session store using |
||
| 587 | [Knex.js](http://knexjs.org/), which is a SQL query builder for PostgreSQL, MySQL, MariaDB, SQLite3, and Oracle. |
||
| 588 | |||
| 589 | [connect-session-knex-url]: https://www.npmjs.com/package/connect-session-knex |
||
| 590 | [connect-session-knex-image]: https://img.shields.io/github/stars/llambda/connect-session-knex.svg?label=%E2%98%85 |
||
| 591 | |||
| 592 | [![★][connect-session-sequelize-image] connect-session-sequelize][connect-session-sequelize-url] A session store using |
||
| 593 | [Sequelize.js](http://sequelizejs.com/), which is a Node.js / io.js ORM for PostgreSQL, MySQL, SQLite and MSSQL. |
||
| 594 | |||
| 595 | [connect-session-sequelize-url]: https://www.npmjs.com/package/connect-session-sequelize |
||
| 596 | [connect-session-sequelize-image]: https://img.shields.io/github/stars/mweibel/connect-session-sequelize.svg?label=%E2%98%85 |
||
| 597 | |||
| 598 | [![★][dynamodb-store-image] dynamodb-store][dynamodb-store-url] A DynamoDB-based session store. |
||
| 599 | |||
| 600 | [dynamodb-store-url]: https://www.npmjs.com/package/dynamodb-store |
||
| 601 | [dynamodb-store-image]: https://img.shields.io/github/stars/rafaelrpinto/dynamodb-store.svg?label=%E2%98%85 |
||
| 602 | |||
| 603 | [![★][express-mysql-session-image] express-mysql-session][express-mysql-session-url] A session store using native |
||
| 604 | [MySQL](https://www.mysql.com/) via the [node-mysql](https://github.com/felixge/node-mysql) module. |
||
| 605 | |||
| 606 | [express-mysql-session-url]: https://www.npmjs.com/package/express-mysql-session |
||
| 607 | [express-mysql-session-image]: https://img.shields.io/github/stars/chill117/express-mysql-session.svg?label=%E2%98%85 |
||
| 608 | |||
| 609 | [![★][express-oracle-session-image] express-oracle-session][express-oracle-session-url] A session store using native |
||
| 610 | [oracle](https://www.oracle.com/) via the [node-oracledb](https://www.npmjs.com/package/oracledb) module. |
||
| 611 | |||
| 612 | [express-oracle-session-url]: https://www.npmjs.com/package/express-oracle-session |
||
| 613 | [express-oracle-session-image]: https://img.shields.io/github/stars/slumber86/express-oracle-session.svg?label=%E2%98%85 |
||
| 614 | |||
| 615 | [![★][express-sessions-image] express-sessions][express-sessions-url]: A session store supporting both MongoDB and Redis. |
||
| 616 | |||
| 617 | [express-sessions-url]: https://www.npmjs.com/package/express-sessions |
||
| 618 | [express-sessions-image]: https://img.shields.io/github/stars/konteck/express-sessions.svg?label=%E2%98%85 |
||
| 619 | |||
| 620 | [![★][connect-sqlite3-image] connect-sqlite3][connect-sqlite3-url] A [SQLite3](https://github.com/mapbox/node-sqlite3) session store modeled after the TJ's `connect-redis` store. |
||
| 621 | |||
| 622 | [connect-sqlite3-url]: https://www.npmjs.com/package/connect-sqlite3 |
||
| 623 | [connect-sqlite3-image]: https://img.shields.io/github/stars/rawberg/connect-sqlite3.svg?label=%E2%98%85 |
||
| 624 | |||
| 625 | [![★][documentdb-session-image] documentdb-session][documentdb-session-url] A session store for Microsoft Azure's [DocumentDB](https://azure.microsoft.com/en-us/services/documentdb/) NoSQL database service. |
||
| 626 | |||
| 627 | [documentdb-session-url]: https://www.npmjs.com/package/documentdb-session |
||
| 628 | [documentdb-session-image]: https://img.shields.io/github/stars/dwhieb/documentdb-session.svg?label=%E2%98%85 |
||
| 629 | |||
| 630 | [![★][express-nedb-session-image] express-nedb-session][express-nedb-session-url] A NeDB-based session store. |
||
| 631 | |||
| 632 | [express-nedb-session-url]: https://www.npmjs.com/package/express-nedb-session |
||
| 633 | [express-nedb-session-image]: https://img.shields.io/github/stars/louischatriot/express-nedb-session.svg?label=%E2%98%85 |
||
| 634 | |||
| 635 | [![★][express-session-cache-manager-image] express-session-cache-manager][express-session-cache-manager-url] |
||
| 636 | A store that implements [cache-manager](https://www.npmjs.com/package/cache-manager), which supports |
||
| 637 | a [variety of storage types](https://www.npmjs.com/package/cache-manager#store-engines). |
||
| 638 | |||
| 639 | [express-session-cache-manager-url]: https://www.npmjs.com/package/express-session-cache-manager |
||
| 640 | [express-session-cache-manager-image]: https://img.shields.io/github/stars/theogravity/express-session-cache-manager.svg?label=%E2%98%85 |
||
| 641 | |||
| 642 | [![★][express-session-level-image] express-session-level][express-session-level-url] A [LevelDB](https://github.com/Level/levelup) based session store. |
||
| 643 | |||
| 644 | [express-session-level-url]: https://www.npmjs.com/package/express-session-level |
||
| 645 | [express-session-level-image]: https://img.shields.io/github/stars/tgohn/express-session-level.svg?label=%E2%98%85 |
||
| 646 | |||
| 647 | [![★][express-etcd-image] express-etcd][express-etcd-url] An [etcd](https://github.com/stianeikeland/node-etcd) based session store. |
||
| 648 | |||
| 649 | [express-etcd-url]: https://www.npmjs.com/package/express-etcd |
||
| 650 | [express-etcd-image]: https://img.shields.io/github/stars/gildean/express-etcd.svg?label=%E2%98%85 |
||
| 651 | |||
| 652 | [![★][fortune-session-image] fortune-session][fortune-session-url] A [Fortune.js](https://github.com/fortunejs/fortune) |
||
| 653 | based session store. Supports all backends supported by Fortune (MongoDB, Redis, Postgres, NeDB). |
||
| 654 | |||
| 655 | [fortune-session-url]: https://www.npmjs.com/package/fortune-session |
||
| 656 | [fortune-session-image]: https://img.shields.io/github/stars/aliceklipper/fortune-session.svg?label=%E2%98%85 |
||
| 657 | |||
| 658 | [![★][hazelcast-store-image] hazelcast-store][hazelcast-store-url] A Hazelcast-based session store built on the [Hazelcast Node Client](https://www.npmjs.com/package/hazelcast-client). |
||
| 659 | |||
| 660 | [hazelcast-store-url]: https://www.npmjs.com/package/hazelcast-store |
||
| 661 | [hazelcast-store-image]: https://img.shields.io/github/stars/jackspaniel/hazelcast-store.svg?label=%E2%98%85 |
||
| 662 | |||
| 663 | [![★][level-session-store-image] level-session-store][level-session-store-url] A LevelDB-based session store. |
||
| 664 | |||
| 665 | [level-session-store-url]: https://www.npmjs.com/package/level-session-store |
||
| 666 | [level-session-store-image]: https://img.shields.io/github/stars/scriptollc/level-session-store.svg?label=%E2%98%85 |
||
| 667 | |||
| 668 | [![★][medea-session-store-image] medea-session-store][medea-session-store-url] A Medea-based session store. |
||
| 669 | |||
| 670 | [medea-session-store-url]: https://www.npmjs.com/package/medea-session-store |
||
| 671 | [medea-session-store-image]: https://img.shields.io/github/stars/BenjaminVadant/medea-session-store.svg?label=%E2%98%85 |
||
| 672 | |||
| 673 | [![★][memorystore-image] memorystore][memorystore-url] A memory session store made for production. |
||
| 674 | |||
| 675 | [memorystore-url]: https://www.npmjs.com/package/memorystore |
||
| 676 | [memorystore-image]: https://img.shields.io/github/stars/roccomuso/memorystore.svg?label=%E2%98%85 |
||
| 677 | |||
| 678 | [![★][mssql-session-store-image] mssql-session-store][mssql-session-store-url] A SQL Server-based session store. |
||
| 679 | |||
| 680 | [mssql-session-store-url]: https://www.npmjs.com/package/mssql-session-store |
||
| 681 | [mssql-session-store-image]: https://img.shields.io/github/stars/jwathen/mssql-session-store.svg?label=%E2%98%85 |
||
| 682 | |||
| 683 | [![★][nedb-session-store-image] nedb-session-store][nedb-session-store-url] An alternate NeDB-based (either in-memory or file-persisted) session store. |
||
| 684 | |||
| 685 | [nedb-session-store-url]: https://www.npmjs.com/package/nedb-session-store |
||
| 686 | [nedb-session-store-image]: https://img.shields.io/github/stars/JamesMGreene/nedb-session-store.svg?label=%E2%98%85 |
||
| 687 | |||
| 688 | [![★][sequelstore-connect-image] sequelstore-connect][sequelstore-connect-url] A session store using [Sequelize.js](http://sequelizejs.com/). |
||
| 689 | |||
| 690 | [sequelstore-connect-url]: https://www.npmjs.com/package/sequelstore-connect |
||
| 691 | [sequelstore-connect-image]: https://img.shields.io/github/stars/MattMcFarland/sequelstore-connect.svg?label=%E2%98%85 |
||
| 692 | |||
| 693 | [![★][session-file-store-image] session-file-store][session-file-store-url] A file system-based session store. |
||
| 694 | |||
| 695 | [session-file-store-url]: https://www.npmjs.com/package/session-file-store |
||
| 696 | [session-file-store-image]: https://img.shields.io/github/stars/valery-barysok/session-file-store.svg?label=%E2%98%85 |
||
| 697 | |||
| 698 | [![★][session-rethinkdb-image] session-rethinkdb][session-rethinkdb-url] A [RethinkDB](http://rethinkdb.com/)-based session store. |
||
| 699 | |||
| 700 | [session-rethinkdb-url]: https://www.npmjs.com/package/session-rethinkdb |
||
| 701 | [session-rethinkdb-image]: https://img.shields.io/github/stars/llambda/session-rethinkdb.svg?label=%E2%98%85 |
||
| 702 | |||
| 703 | ## Example |
||
| 704 | |||
| 705 | A simple example using `express-session` to store page views for a user. |
||
| 706 | |||
| 707 | ```js |
||
| 708 | var express = require('express')
|
||
| 709 | var parseurl = require('parseurl')
|
||
| 710 | var session = require('express-session')
|
||
| 711 | |||
| 712 | var app = express() |
||
| 713 | |||
| 714 | app.use(session({
|
||
| 715 | secret: 'keyboard cat', |
||
| 716 | resave: false, |
||
| 717 | saveUninitialized: true |
||
| 718 | })) |
||
| 719 | |||
| 720 | app.use(function (req, res, next) {
|
||
| 721 | if (!req.session.views) {
|
||
| 722 | req.session.views = {}
|
||
| 723 | } |
||
| 724 | |||
| 725 | // get the url pathname |
||
| 726 | var pathname = parseurl(req).pathname |
||
| 727 | |||
| 728 | // count the views |
||
| 729 | req.session.views[pathname] = (req.session.views[pathname] || 0) + 1 |
||
| 730 | |||
| 731 | next() |
||
| 732 | }) |
||
| 733 | |||
| 734 | app.get('/foo', function (req, res, next) {
|
||
| 735 | res.send('you viewed this page ' + req.session.views['/foo'] + ' times')
|
||
| 736 | }) |
||
| 737 | |||
| 738 | app.get('/bar', function (req, res, next) {
|
||
| 739 | res.send('you viewed this page ' + req.session.views['/bar'] + ' times')
|
||
| 740 | }) |
||
| 741 | ``` |
||
| 742 | |||
| 743 | ## License |
||
| 744 | |||
| 745 | [MIT](LICENSE) |
||
| 746 | |||
| 747 | [npm-image]: https://img.shields.io/npm/v/express-session.svg |
||
| 748 | [npm-url]: https://npmjs.org/package/express-session |
||
| 749 | [travis-image]: https://img.shields.io/travis/expressjs/session/master.svg |
||
| 750 | [travis-url]: https://travis-ci.org/expressjs/session |
||
| 751 | [coveralls-image]: https://img.shields.io/coveralls/expressjs/session/master.svg |
||
| 752 | [coveralls-url]: https://coveralls.io/r/expressjs/session?branch=master |
||
| 753 | [downloads-image]: https://img.shields.io/npm/dm/express-session.svg |
||
| 754 | [downloads-url]: https://npmjs.org/package/express-session |
||
| 755 | [gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg |
||
| 756 | [gratipay-url]: https://gratipay.com/dougwilson/ |