프로젝트

일반

사용자정보

통계
| 개정판:

root / HServer / 00.Server / 00.Program / node_modules / express-session / README.md

이력 | 보기 | 이력해설 | 다운로드 (31.4 KB)

1
# 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/