# Sessions
# Already installed? Jump to Usage
Migrating?
At version 1.0.0, xpresser will STOP shipping with session support out of the box because It benefits the
framework more as a standalone plugin.
However, this plugin re-enables the old session system and is simply Plug & Play.
Migrating does not affect code usage. Sessions data still exists in http.session
.
# Setup
Install session plugin
npm i @xpresser/session
// OR
yarn add @xpresser/session
# Register Plugin
Add plugin to your plugins.json
file. if you don't have one, create one at backend/plugins.json
.
Note: Plugin should come before other plugins that requires session
# Configuration
Note: Session is enabled and sqlite store is used by default without any configuration.
Import default configuration file using the command below
xjs import session configs
Check imported config file for more settings @ configs/session(.js|.ts)
# Required Declarations (Typescript)
Add the code below to your xpresser.d.ts
file.
import "@xpresser/session/xpresser";
# Usage
Session data is an object stored in http.session
which is a shortHand for http.req.session
.
Typescript
http.session
is a type of XSessionCustomData
, declared
in @xpresser/session/xpresser.d.ts
(opens new window).
# Set/Update session
route.post('/login', http => {
// Add to Session
http.session.user = http.body('username');
return 'Login Successful!'
});
# Get session
route.post('/account', http => {
// Asign session.user to const user.
const user = http.session.user;
return {user}
});
# Delete Session
route.post('/logout', http => {
// Delete session with key `user`
delete http.session.user;
return 'User Deleted successfully.'
});
# Advanced
# Using Custom Store.
To use a custom session store, you need to set useDefault
to false
and set your custom store function
# Custom Store Example.
The example below is a mongodb custom store using connect-mongodb-session (opens new window)
# Defining Types For Session Values (Typescript)
In order to prevent errors when compiling you have to extend XSessionCustomData
interface. let's assume we have a
variable user
that references a User
database model;
// Assuming class user is:
class User {
public name: string;
public email: string;
public password: string;
}
http.session.user = new User();
The last line above may throw an error depending on your strict settings because typescript knows user
is not defined
in http.session
OR in type XSessionCustomData
. You are just about to define it, so you have to tell typescript about
this and what type user
is.
Add to xpresser.d.ts
declare module "@xpresser/session/custom-types" {
interface XSessionCustomData {
user: User
}
}
With the declaration above http.session.user.email
should be accessible.