
Company News
Socket Named Top Sales Organization by RepVue
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.
Fichier standard des modules npm pour node. Déclare les dépendances, les scripts, etc.
Voici les extraits importants:
"scripts": {
"lint": "standard",
"start": "standard && rejoice -c manifest.json -p $(pwd)"
}
On déclare deux scripts npm.
Vérifie le code style avec StandardJS.
Lance le serveur web hapi à partir de rejoice qui lira le fichier manifest.json.
"engines": {
"node": ">=4"
}
Vous devez utiliser nodeJS v4 ou mieux.
"devDependencies": {
"standard": "^7.1.1"
}
On déclare standard comme dépendance de développement pour npm run lint
mais standard ne sert pas à l'usage normal.
"dependencies": {
"dogwater": "^1.1.0",
"good": "^7.0.1",
"good-console": "^6.1.2",
"good-squeeze": "^3.0.1",
"hapi": "^13.4.1",
"hapi-auth-cookie": "^6.1.1",
"pug": "^2.0.0-alpha8",
"rejoice": "^3.2.0",
"sails-memory": "^0.10.6",
"vision": "^4.1.0",
"visionary": "^6.0.0"
}
Le serveur dépend de plusieurs modules, voici les plus importants.
La base du framework.
Dépend lui-même du module glue pour lire le fichier manifest.json et produire un serveur web.
Sert à interpréter les templates des views.
Gestionnaire de vision, pour usage avec rejoice/glue.
Anciennement Jade, pug est l'engin de template qu'on va utiliser avec vision.
Gestionnaire du cookie d'authentification.
Avec good-console et good-squeeze, log les accès au serveur web.
Fichier standard pour hapi. Rejoice lit un fichier manifest.json avec glue et démarre le serveur web tel que spécifié. Tous les détails se trouvent dans le document Glue API (en anglais).
On utilise deux sections, connections et registrations.
On déclare un seul serveur web, répondant au port 3030:
"connections": [{ "port": 3030 }]
La plus grosse partie du fichier manifest est constituée de plugins sous formes d'objets ({} dans l'exemple) dans le tableau registrations:
"registrations": [ {}, {} ]
Voici la liste de chacun des plugins.
{ "plugin": "vision" }
Au plus simple, un plugin déclare un nom de module. Ici, vision, qu'on avait pris soin d'ajouter aux dépendances dans package.json.
On aurait pu aussi écrire dans une forme plus longue:
{
"plugin": {
"register": "vision"
}
}
On verra ce format avec les autres plugins.
{
"plugin": {
"register": "visionary",
"options": {
"engines": { "pug": "pug" },
"path": "views",
"isCached": false
}
}
}
Avec rejoice/glue, il faut le gestionnaire visionary pour passer les options à vision. C'est ici qu'on déclare l'engin de templates, pug avec l'extension de fichiers .pug et où trouver les templates, dans le répertoire views.
Par défaut, isCached est true et les templates ne sont lu qu'une seule fois à partir du disque. Pour le développement, c'est plus pratique de désactiver ce cache puisque ça permet l'édition des templates et leur rafraichissement au niveau du serveur web sans devoir redémarrer ce dernier.
{ "plugin": "hapi-auth-cookie" }
Gestion du cookie de session. On verra son usage dans plugins/login/index.js un peu plus loin.
{
"plugin": {
"register": "./plugins/login",
"options": {
"auth": {
"mode": "try"
}
}
}
}
Tel que déclaré dans plugins/login/package.json ce plugin dépend de hapi-auth-cookie.
On notera que le chemin du plugin (register) commence par ./ pour indiquer qu'il s'agit d'un plugin local et non d'un module npm.
L'option auth.mode est optionnelle et déclare le mode par défaut d'authentification. Avec "try" ou "optional", le cookie est vérifié à chaque route. Sans cette vérification, l'information du cookie n'est pas disponible à la route. Enfin avec "required", l'authentification doit être validée avant d'avoir accès à la route. Sans authentification, le serveur web retourne un 401.
On verra plus tard comment configurer auth route par route, au besoin.
{ "plugin": "./routes/home" }
Enfin, on déclare des routes, ici avec un plugin local.
Plugin qui déclare nos routes. Il faut nommer le plugin, lui donner une version, énumérer ses dépendances (hapi-auth-cookie ici) et enfin lui passer un tableau d'objets routes:
[
{
method: 'GET',
path: '/',
handler: function (request, reply) {
reply.view('user', request.auth)
}
},
{
method: 'GET',
path: '/login',
handler: function (request, reply) {
request.cookieAuth.set({ bam: 'paff' })
reply.redirect('/')
}
},
{
method: 'GET',
path: '/logout',
handler: function (request, reply) {
request.cookieAuth.clear()
reply.redirect('/')
}
}
]
Ceci déclare trois chemins qui répondent à la méthode http get:
La méthode reply.view() vient du plugin vision et retourne le
template en premier argument ('user') avec le contexte (les valeurs)
du second argument (request.auth). Pour nos premiers tests, on se
contente d'afficher l'information d'authentification.
Au login, on set le cookie d'authentification. Comme pour tous les cookies, on doit absolument rediriger (charger une autre page) pour qu'il prenne effet.
Au logout, on clear le cookie d'authentification. Comme pour tous les cookies, on doit absolument rediriger (charger une autre page) pour qu'il prenne effet.
Le fichier utils.js déclare quelques fonctions.
exports.routePlugin = function (attributes, routes) {
// ...
}
La fonction routePlugin est utilisée dans ./routes/home.js et permet de facilement créer des plugins pour les routes.
Événtuellement, il faudra explorer hapi-routify.
À venir
À venir
Définit notre stratégie d'authentification. Le mode défini dans manifest.json est passée à ce plugin, ainsi que quelques autres options pour configurer la stratégie.
Déclare les dépendances du plugin (du même répertoire) ainsi que son nom et sa version.
Les views sont des templates. Dans notre configuration, les templates sont interprétés par pug (anciennement jade). Notez que l'indentation est importante dans un fichier pug.
Dans ./routes/home.js on passe request.auth au view, ce qui nous donne accès à plusieurs variables dans le template.
Pour déterminer si l'utilisateur est connecté:
if isAuthenticated
p: a(href='/logout') Logout
else
p: a(href='/login') Login
On affichera un lien login ou logout, selon l'état actuel.
On peut aussi tester une variable et afficher son contenu:
if credentials
h3 credentials
pre= JSON.stringify(credentials, null, ' ')
FAQs
hapi thingy
We found that hapi-users demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.