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