


Node.js Web Application Framework Express Guide de démarrage_Conseils Javascript
1.Installation
ou utilisez-le n'importe où Installation de l'exécutable express(1) :
$ npm install - g express
2. Commencez vite
Le moyen le plus rapide de démarrer avec Express est d'utiliser l'exécutable express(1) pour générer une application, comme indiqué ci-dessous :
Créer une application :
$ npm install -g express
$ express /tmp/foo && cd /tmp/foo
Installer les packages de dépendances :
$ npm install -d
Démarrez le serveur :
$ node app.js
3. Créer un serveur
Pour créer une instance express.HTTPServer, appelez simplement la méthode createServer(). Commun à cet exemple d'application, nous pouvons définir un routage basé sur des actions HTTP (Verbes HTTP), en prenant comme exemple app.get() :
var app = require('express').createServer();
app.get('/', function(req, res){
res.send('hello world');
});
app.listen(3000);
4. Créez un serveur HTTPS
Initialisez une instance express.HTTPServer comme ci-dessus. Ensuite, nous lui transmettons un objet de configuration qui accepte les clés, certificats et autres (propriétés/méthodes) mentionnés dans la documentation https.
var app = require('express') .createServer( { clé : ... });
5.Configuration
Express prend en charge n'importe quel environnement, tel que la production et le développement. Les développeurs peuvent utiliser la méthode configure() pour définir l'environnement actuellement requis. Si l'appel à configure() n'inclut aucun nom d'environnement, il exécutera les rappels spécifiés dans tous les environnements.
Annotation : les alias tels que production/développement/étape peuvent être choisis par vous-même, comme indiqué dans app.configure dans application.js. Voir l'exemple ci-dessous pour une utilisation réelle.
L'exemple suivant ne dumpExceptions (génère une erreur) pendant la phase de développement et renvoie une exception de pile. Mais dans les deux environnements, nous utilisons methodOverride et bodyParser. Faites attention à l'utilisation de app.router. Il peut (facultatif) être utilisé pour charger (monter) la route du programme. De plus, le premier appel à app.get(), app.post(), etc. charger également l'itinéraire.
app.configure(function(){
app .use(express.methodOverride());
app.use(express.bodyParser());
app.use(app.router);
});
app.configure('development', function(){
app.use(express.static(__dirname '/public'));
app.use(express.errorHandler({ dumpExceptions : true, showStack : vrai }));
});
app.configure('production', function(){
var oneYear = 31557600000;
app.use(express.static(__dirname '/public', { maxAge: oneYear }));
app.use(express.errorHandler());
});
Pour des environnements similaires, vous pouvez transmettre plusieurs chaînes d'environnement :
app.configure('stage', 'prod', function(){
// config
});
Pour tout paramètre interne (#), Express fournit les méthodes set(key[, val]), activate(key) et Disable(key) :
Annotation : Pour plus de détails sur les paramètres, voir : app.set dans application.js.
app.configure(function(){
app .set('views', __dirname '/views');
app.set('views');
// => "/absolute/path/to/views"
app.enable('some feature');
// Équivalent à : app.set('some feature', true);
app.disable('some feature');
// Équivalent à : app.set('some feature', false);
app.enabled('some feature')
// => false
});
Pour changer l'environnement, nous pouvons définir la variable d'environnement NODE_ENV, telle que :
$ NODE_ENV=production node app.js
Ceci est très important, car la plupart des mécanismes de mise en cache ne sont activés que pendant la phase de production.
6. Paramètres
Express prend en charge les paramètres prêts à l'emploi suivants :
1.basepath Le chemin de base de l'application utilisé pour res.redirect(), gérant explicitement les applications montées
2.view Le répertoire racine par défaut de View For CWD/views
3.view engine Le moteur par défaut. Le traitement du moteur de visualisation (afficher les fichiers) n'a pas besoin d'utiliser le suffixe
4.view cache Activer le cache de visualisation (activé au stade de la production)
5.charet Changer l'encodage, La valeur par défaut est utf-8
6 Les routes sensibles à la casse sont sensibles à la casse dans le routage
7.strit routage Après avoir activé (dans le routage) le / de fin ne sera pas ignoré (Annotation : app.get('/sofish ') et app.get('/sofish/ ') sera différent)
Le rappel 8.json permet le support explicite de res.send() / res.json() (support jsonp transparent)
7. Routage
Express fournit un ensemble d'API de routage informatives et expressives utilisant des actions HTTP. Par exemple, si nous voulons traiter un compte avec le chemin /user/12, nous pouvons définir la route comme suit. Les valeurs associées aux espaces réservés nommés sont accessibles à l'aide de req.params.
app.get('/user/ : id', function(req, res){
res.send('user ' req.params.id);
});
La route est une chaîne compilée en interne dans un chaîne régulière. Par exemple, lorsque /user/:id est compilé, une version simplifiée de l'expression régulière ressemble à ceci :
// Modifier la chaîne officielle
//user/([^/] )/?/
Les expressions régulières peuvent être transmises à s'applique à une scène complexe. Étant donné que les groupes de contenu capturés via des expressions régulières littérales sont anonymes, nous pouvons y accéder directement via req.params. Par conséquent, le premier ensemble de contenu que nous capturons sera req.params[0], tandis que le deuxième ensemble suivra immédiatement req.params[1].
app.get(/^/users? (?: /(d )(?:..(d ))????/, function(req, res){
res.send(req.params);
});
Curl Pour la demande du parcours défini ci-dessus :
$ curl http://dev:3000/user
[null,null]
$ curl http://dev:3000/users
[null,null]
$ curl http://dev:3000/users /1
["1",null]
$ curl http://dev:3000/users/1..15
["1","15 "]
ci-dessous Ce sont des instances de certains itinéraires, associés aux chemins qu'ils peuvent emprunter :
"/user/:id"
/user/12
"/users/:id?"
/users/5
/users
"/files/*"
/files/jquery.js
/files/javascripts/jquery.js
"/file/*.*"
/files/jquery.js
/files/javascripts/jquery.js
"/user/:id/:operation?"
/user/1
/user/1/edit
"/products.:format"
/products.json
/products.xml
"/products.:format?"
/products.json
/products.xml
/products
"/user/:id.:format?"
/user/12
/user/12.json
Par exemple, nous pouvons utiliser POST pour envoyer des données json via bodyParser. le middleware peut analyser le contenu de la requête JSON (ou tout autre contenu) pour renvoyer des données et stocker le résultat du retour dans req.body :
var express = require('express')
, app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
res.send(req.body);
});
app.listen(3000);
Habituellement, nous pouvons utiliser un espace réservé "insensé" comme user/:id qui n'a aucune restriction (de dénomination). Cependant, par exemple, si nous souhaitons limiter l'ID utilisateur aux seuls chiffres, nous pourrions alors utiliser /user/:id([0-9]), qui ne prendra effet que lorsque l'espace réservé contient au moins un chiffre (adaptation , correspondre).
8. Contrôle de la route de dépassement
Nous pouvons contrôler le prochain itinéraire adapté en appelant le troisième paramètre, la fonction next(). Si aucun adaptateur n'est trouvé, le contrôle sera rendu à Connect et le middleware sera appelé dans l'ordre ajouté dans use(). Le même principe s'applique à plusieurs routes définies sur le même chemin. Elles seront appelées en séquence jusqu'à ce que l'une d'entre elles décide de répondre à la requête sans appeler next().
app.get('/users/ : id?' , function(req, res, next){
var id = req.params.id;
if (id) {
// faire quelque chose
} else {
suivant ();
}
});
app.get('/users', function(req, res){
// faire autre chose
});
la méthode app.all() doit uniquement être appelée once Appliquez facilement la même logique à toutes les actions HTTP. Ci-dessous, nous l'utilisons pour extraire un utilisateur des données factices et l'attribuer à req.user.
var express = require('express')
, app = express.createServer();
var utilisateurs = [{ nom : 'tj' }];
app.all('/user/:id/:op?', function(req, res, next){
req.user = users[req.params.id];
if (req .user) {
next();
} else {
next(new Error('impossible de trouver l'utilisateur ' req.params.id));
}
});
app.get('/user/:id', function(req, res){
res.send('viewing ' req.user.name);
});
app.get('/user/:id/edit', function(req, res){
res.send('editing ' req.user.name);
});
app.put('/user/:id', function(req, res){
res.send('updating ' req.user.name);
});
app.get('*', function(req, res){
res.send(404, 'quoi???');
});
app.listen(3000);
9. Intergiciel
Le middleware Connect (propriétés) utilisé accompagne généralement l'un de vos serveurs Connect habituels, transmis à express.createServer() . Par exemple :
var express = require(' exprimer');
var app = express.createServer(
express.logger()
, express.bodyParser()
);
De plus, dans le bloc configure() - ce progressif De manière progressive, on peut aussi facilement utiliser use() pour ajouter du middleware.
app.use(express.logger({ format : ' :method :url' }));
Habituellement, lorsque vous utilisez le middleware de connexion, vous pouvez utiliser require('connect'), comme ceci :
var connect = require('connect');
app.use(connect.logger());
app.use(connect.bodyParser()) ;
C'est quelque peu ennuyeux, donc express réexporte ces propriétés du middleware, même si elles sont les mêmes :
app.use(express.logger());
app.use(express.bodyParser());
L'ordre du middleware est très important. Lorsque Connect reçoit une requête, le premier middleware que nous transmettons à createServer() ou use() pour l'exécution sera accompagné de trois paramètres, requête, réponse et une fonction de rappel (généralement suivante). Lorsque next() sera appelé, ce sera le tour du deuxième middleware, et ainsi de suite. Ceci est remarquable car de nombreux middlewares dépendent les uns des autres. Par exemple, methodOverride() interroge la méthode req.body pour détecter les surcharges de la méthode HTTP, tandis que bodyParser() analyse le contenu de la requête et le stocke dans le corps de la requête. Un autre exemple est l'analyse des cookies et la prise en charge de la session, nous devons d'abord utiliser() cookieParser() suivi de session().
De nombreuses applications Express contiennent une ligne comme app.use(app.router). Cela peut sembler un peu étrange, mais en fait, il s'agit simplement d'une ligne qui contient toutes les règles de routage définies et effectue une recherche d'itinéraire basée sur celles existantes. Requête URL et méthode HTTP. Une fonction middleware. Express permet de déterminer sa position, mais par défaut il est placé en bas. En changeant l'emplacement de la route, nous pouvons modifier la priorité du middleware. Par exemple, nous voulons signaler les erreurs du dernier middleware afin que toutes les exceptions transmises à next() puissent être gérées via celui-ci. la priorité du service est inférieure pour permettre à notre routeur d'écouter le nombre de téléchargements d'une seule demande de fichier statique, etc. Cela ressemble plus ou moins à ceci :
app.use( express.logger(...));
app.use(express.bodyParser(...));
app.use(express.cookieParser(...));
app.use (express.session(...));
app.use(app.router);
app.use(express.static(...));
app.use (express.errorHandler (...));
Nous ajoutons d'abord logger(), qui peut contenir la méthode req.end() du nœud pour nous fournir des données de temps de réponse. Le contenu de la requête suivante sera analysé (s'il y a des données), suivi de l'analyse des cookies et de la prise en charge de la session. En même temps, req.session sera défini lorsque la route dans app.router sera déclenchée. à ce moment-là, next(), donc le middleware static() ne connaîtra pas cette requête. Si la route suivante a été définie, nous pouvons enregistrer divers statuts, refuser les téléchargements, consommer des points de téléchargement, etc.
var downloads = {};
app.use(app.router);
app.use(express.static(__dirname '/public'));
app.get('/*', function(req, res, next){
var file = req.params[0];
downloads[file] = downloads[file] || 0;
téléchargements[fichier] ;
suivant();
});
10. Middleware de routage
Le routage peut utiliser le middleware du routeur pour transmettre plus d'une fonction de rappel (ou tableau) à sa méthode. Cette fonctionnalité est idéale pour restreindre l'accès, télécharger des données via le routage, etc.
Habituellement, la récupération de données asynchrone peut ressembler à l'exemple suivant, où nous utilisons le paramètre :id et essayons de charger un utilisateur :
app.get('/user/:id', function(req, res, next){
loadUser(req.params.id , function(err, user ){
if (err) return next(err);
res.send('Viewing user ' user.name);
});
});
est Pour garantir le principe DRY et améliorer la lisibilité, nous pouvons appliquer cette logique au sein d'un middleware. Comme indiqué ci-dessous, extraire cette logique dans un middleware vous permettra de la réutiliser tout en gardant notre routage simple.
function loadUser(req, res, next) {
// Vous récupéreriez votre utilisateur depuis la base de données
var user = users[req.params.id];
if (user ) {
req.user = user;
next();
} else {
next(new Error('Échec du chargement de l'utilisateur ' req.params.id));
}
}
app.get('/user/:id', loadUser, function(req, res){
res.send('Viewing user' req.user.name);
});
Plusieurs itinéraires peuvent être appliqués séquentiellement à une logique plus profonde, comme la restriction de l'accès à un compte utilisateur. L'exemple ci-dessous permet uniquement aux utilisateurs authentifiés de modifier son compte.
function andRestrictToSelf(req, res, next) {
req.authenticatedUser.id == req.user.id
? next()
: next(new Error('Unauthorized'));
}
app.get('/user/:id/edit',loadUser etRestrictToSelf, function(req, res){
res.send('Modification de l'utilisateur ' req.user.name);
} );
N'oubliez pas que les routes ne sont que des fonctions simples, comme indiqué ci-dessous, nous pouvons définir des fonctions qui renvoient un middleware pour créer une solution plus expressive et flexible.
function andRestrictTo(role) {
return function( req, res, next) {
req.authenticatedUser.role == role
next()
: next(new Error('Unauthorized'));
}
>
app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
res.send('Utilisateur supprimé ' req.user.name);
});
Les "piles" de middleware couramment utilisées peuvent être transmises à travers un tableau (sera appliqué de manière récursive), qui peut être mélangé et adapté à n'importe quel niveau (qui peut être mélangé et associé à n'importe quel degré) .
var a = [middleware1, middleware2]
, b = [middleware3, middleware4]
, tout = [a, b];
app.get('/foo', a, function(){});
app.get('/bar', a, function(){});
app.get('/', a, middleware3, middleware4, function(){});
app.get('/', a, b, function(){});
app .get('/', all, function(){});
Pour le code complet de cet exemple, veuillez consulter le référentiel d'exemples de middleware de route.
Nous souhaiterons peut-être « sauter » le middleware de routage restant plusieurs fois et continuer à faire correspondre les itinéraires suivants. Pour ce faire, nous appelons simplement next() avec la chaîne 'route' - next('route'). Si aucun itinéraire restant ne correspond à l’URL demandée, Express renverra 404 Not Found.
11. Méthode HTTP
J'ai rencontré app.get() plusieurs fois jusqu'à présent. De plus, Express propose également d'autres actions HTTP courantes, telles que app.post(), app.del(), etc.
Un exemple courant d'utilisation du POST consiste à soumettre un formulaire. Ensuite, nous définissons simplement l'attribut méthode du formulaire pour qu'il soit publié en HTML, et le contrôle sera attribué à l'itinéraire défini ci-dessous.
Par défaut, Express ne sait pas comment gérer le contenu de cette demande, nous doit ajouter le middleware bodyParser, il analysera le contenu demandé par application/x-www-form-urlencoded et application/json, et stockera les variables dans req.body. On peut utiliser ce middleware comme l'exemple suivant :
app.use(express.bodyParser());
Comme indiqué ci-dessous, notre route aura accès à l'objet req.body.user, qui contiendra le nom et l'email une fois défini (Annotation : Si le contenu envoyé par le formulaire n'est pas vide).
app.post('/', function (req, res){
console.log(req.body.user);
res.redirect('back');
});
Quand vous souhaitez utiliser quelque chose comme PUT dans un formulaire De cette façon, nous pouvons utiliser une entrée cachée nommée _method, qui peut être utilisée pour modifier la méthode HTTP. Pour ce faire, nous avons d'abord besoin du middleware methodOverride, qui doit apparaître après le bodyParser afin d'utiliser les valeurs du formulaire contenues dans son req.body.
app.use(express.bodyParser() );
app.use(express.methodOverride());
Quant à savoir pourquoi ces méthodes ne sont pas disponibles par défaut, simplement parce qu'elles ne sont pas requises pour la fonctionnalité complète requise par Express. L'utilisation des méthodes dépend de votre application, vous n'en aurez peut-être pas besoin, le client peut toujours utiliser des méthodes comme PUT et DELETE, vous pouvez les utiliser directement, car methodOverride fournit une très bonne solution pour les formulaires. Ce qui suit montre comment utiliser la méthode PUT, qui peut ressembler à :
app.put('/', function(){
console.log(req.body.user);
res.redirect('back');
});
12. Gestion des erreurs
Express fournit la méthode app.error() afin que l'exception reçue puisse être levée dans une route ou transmise à next(err). L'exemple suivant gérera différentes pages en fonction d'une exception NotFound spécifique :
function NotFound(msg){
this.name = 'NotFound';
Error.call(this, msg);
Error.captureStackTrace(this, arguments.callee);
}
NotFound.prototype.__proto__ = Erreur.prototype;
app.get('/404', function(req, res){
throw new NotFound;
});
app.get('/500', function(req, res){
throw new Error('keyboard cat!');
});
Comme suit, nous pouvons Appel de app.error() plusieurs fois. Ici, nous détectons les instances de NotFound et affichons une page 404 ou la transmettons au gestionnaire d'erreurs suivant. Il est à noter que ces gestionnaires peuvent être définis n'importe où, car ils seront placés sous le gestionnaire de route lors de l'écoute (). Il autorise les définitions dans le bloc configure() afin que nous puissions utiliser différentes méthodes de gestion des exceptions en fonction de l'environnement.
app.error(function(err, req , res, suivant){
if (err instanceof NotFound) {
res.render('404.jade');
} else {
next(err);
}
}) ;
Par souci de simplicité, nous supposons ici que toutes les erreurs dans cette démo sont de 500. Bien sûr, vous pouvez choisir celle que vous aimez. Lorsque le nœud exécute un appel système sur le système de fichiers, vous pouvez recevoir un code d'erreur avec ENOENT, ce qui signifie une erreur "aucun fichier ou répertoire de ce type n'existe". Nous pouvons l'utiliser dans le gestionnaire d'erreurs, ou lorsqu'il existe une page spécifiée. être affiché en cas de besoin.
app.error(function(err, req , res) {
res.render('500.jade', {
erreur : err
});
});
Notre application peut également utiliser le middleware errorHandler de Connect pour signaler les exceptions. Par exemple, lorsque nous voulons générer des exceptions stderr dans l'environnement "développement", nous pouvons utiliser :
app.use(express.errorHandler({ dumpExceptions: true }));
En même temps pendant la phase de développement nous pouvons avoir besoin d'afficher les exceptions nous passons et lançons des pages HTML sophistiquées. Pour cela, nous pouvons définir showStack sur true.
app.use(express.errorHandler({ showStack: true , dumpExceptions: true }));
errorHandler middleware peut également renvoyer json lorsque Accept: application/json existe, ce qui est très utile pour développer des applications qui s'appuient fortement sur Javascript côté client.
13. Prétraitement des paramètres d'itinéraire
Le prétraitement des paramètres d'itinéraire, grâce au chargement implicite des données et à la vérification des demandes, peut grandement améliorer la lisibilité de votre programme. Par exemple, vous devez souvent obtenir en permanence des données de base provenant de plusieurs itinéraires. Comme pour charger un utilisateur avec /user/:id, nous pouvons généralement le faire comme ceci :
app.get('/user/:userId', function(req, res, next){
User.get(req.params.userId, function(err, user) {
if (err) return next(err);
res.send('user ' user.name);
});
});
Grâce au prétraitement, Les paramètres we peuvent être mappés à des rappels qui effectuent une validation, un contrôle (coercition) ou même chargent des données à partir de la base de données. Comme suit, nous appelons app.param() avec le nom du paramètre, dans l'espoir de le mapper à un middleware. Comme vous pouvez le voir, nous acceptons le paramètre id qui représente la valeur de l'espace réservé. En utilisant cela, nous chargeons l'utilisateur et traitons les erreurs comme d'habitude, et appelons simplement next() pour passer le contrôle au prochain préprocesseur ou gestionnaire de route.
app.param('userId', function (req, res, next, id){
User.get(id, function(err, user){
if (err) return next(err);
if (!user) return next( new Error( 'failed to find user'));
req.user = user;
next();
});
});
Une fois cela fait , ce qui précède améliorera considérablement la lisibilité du routage et nous permettra de partager facilement la logique tout au long du programme :
app.get('/user/:userId', function(req, res){
res.send('user ' req.user.name);
} );
14. Afficher le traitement
Afficher les fichiers utilise le format
L'exemple suivant utilise Jade pour traiter index.html. Parce que nous n'utilisons pas layout: false, le contenu traité par index.jade sera transmis dans une variable locale nommée body dans layout.jade.
app.get('/', function (req, res){
res.render('index.jade', { title: 'My Site' });
});
Le nouveau paramètre du moteur d'affichage nous permet de spécifier le moteur de modèle par défaut, par exemple, lorsque nous utilisons jade, nous pouvons le définir comme ceci :
app .set('view engine', 'jade');
nous permet de faire cela :
res.render('index');
correspond à :
res.render('index.jade');
Lorsque le moteur de visualisation est défini, l'extension est facultative, mais on peut toujours mélanger et match Moteur de modèle :
res.render(' another-page.ejs');
Express fournit également des paramètres d'options d'affichage, qui seront appliqués à chaque rendu d'une vue. Par exemple, vous pouvez le faire si vous ne souhaitez pas utiliser de mises en page :
layout : false
});
open: '{{',
fermer : '}}'
})
15. Afficher le composant
Le système de vue d'Express prend en charge les partiels et les collections, ce qui équivaut à remplacer un fragment de document par une vue « mini ». Par exemple, pour afficher des commentaires de manière répétée dans une vue, on peut utiliser le jeu de widgets :En cours d'utilisation, l'ensemble de widgets prend en charge gratuitement certaines variables locales « magiques » :
1.firstInCollection true, lorsqu'il s'agit du premier objet
2.indexInCollection index dans l'objet collecteur
3.lastInCollection true, lorsqu'il s'agit du dernier objet
4 .collectionLength La longueur du collecteur objet
Le transfert (génération) des variables locales a une priorité plus élevée. Dans le même temps, les variables locales transmises à la vue parent sont également adaptées à la vue enfant. Par exemple, lorsque nous utilisons partial('blog/post', post) pour afficher un article de blog, cela générera une variable locale de publication. Il y a une variable locale user dans la vue qui appelle cette fonction, et elle sera également valide. pour le blog/article. (Annotation : partial ici ressemble plus à la méthode include en php).
Remarque : veuillez utiliser les collecteurs de widgets avec prudence. Le rendu d'un tableau de collection de widgets d'une longueur de 100 équivaut à devoir traiter 100 vues. Pour les collections simples, il est préférable de répéter le processus intégré plutôt que d'utiliser un collecteur de widgets pour éviter une surcharge excessive.
16. Afficher la recherche
La recherche de vue est effectuée par rapport à la vue parent (chemin). Par exemple, si nous avons une page de vue appelée views/user/list.jade et que partial('edit') est écrit à l'intérieur, il essaiera de le faire. charger vues/utilisateur/edit.jade, de même partiel('../messages') chargera vues/messages.jade.
Le système View prend également en charge l'indexation des modèles, vous permettant d'utiliser un répertoire portant le même nom que la vue. Par exemple, dans une route, res.render('users') renvoie vues/users.jade, qui est vues/users/index.jade. (Annotation : gérez d'abord le cas
Lors de l'utilisation de l'index de vue ci-dessus, nous utilisons partial('users') pour référencer vues/users/index.jade dans le même répertoire que la vue. En même temps, le système de vue essaiera d'indexer ../. users/index. Sans que nous appelions partial('users').
17. Moteurs de modèles
Voici les moteurs de modèles les plus couramment utilisés pour Express :
1.Haml : implémentation de haml
2.Jade : successeur de haml.js
3.EJS : JavaScript intégré
4.CoffeeKup : modèle basé sur CoffeeScript
5.Modèles jQuery
18. Prise en charge des sessions
La prise en charge de la session peut être obtenue en utilisant le middleware de session de Connect. Pour cela, nous devons généralement ajouter le middleware cookieParser devant celui-ci, qui analysera et stockera les données des cookies dans req.cookies.
app.use(express.cookieParser() );
app.use(express.session({ secret: "keyboard cat" }));
Par défaut, le middleware de session utilise le stockage mémoire intégré de Connect, mais il existe de nombreuses autres implémentations . Par exemple, connect-redis fournit un stockage de session Redis, qui peut être utilisé comme suit :
var RedisStore = require('connect-redis')(express);
app.use(express.cookieParser());
app.use(express.session( { secret : "keyboard cat", store : new RedisStore }));
À ce stade, les propriétés req.session et req.sessionStore seront disponibles pour toutes les routes et middleware ultérieurs. Toutes les propriétés sur req.session seront automatiquement enregistrées dans une réponse, par exemple lorsque nous souhaitons ajouter des données au panier :
var RedisStore = require('connect-redis')(express);
app.use(express.bodyParser());
app .use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat", store: new RedisStore }));
app.post('/add-to-cart', function(req, res){
// Nous pouvons POSTER plusieurs éléments via un formulaire
// (utilisez bodyParser() dans certains cas Middleware )
var items = req.body.items;
req.session.items = items;
res.redirect('back');
});
app.get('/add-to-cart', function(req, res){
// Une fois renvoyée, la page GET /add-to-cart
// Nous pouvons vérifier req. session.items && req.session.items.length
// Pour imprimer l'invite
if (req.session.items && req.session.items.length) {
req.notify('info ' , 'Vous avez %s articles dans votre panier', req.session.items.length);
}
res.render('shopping-cart');
});
Pour req.session, il dispose également de méthodes comme Session#touch(), Session#destroy(), Session#regenerate(), etc. pour maintenir et faire fonctionner la session. Consultez la documentation de la session Connect pour plus de détails.
19. Guide de mise à niveau
Pour les étudiants utilisant Express 1.x, si vous avez des programmes importants qui doivent être mis à niveau vers 2.x pour un meilleur support, veuillez consulter le guide de migration officiel très détaillé : http:/ /expressjs. com/guide.html#migration-guide

Comprendre le fonctionnement du moteur JavaScript en interne est important pour les développeurs car il aide à écrire du code plus efficace et à comprendre les goulots d'étranglement des performances et les stratégies d'optimisation. 1) Le flux de travail du moteur comprend trois étapes: analyse, compilation et exécution; 2) Pendant le processus d'exécution, le moteur effectuera une optimisation dynamique, comme le cache en ligne et les classes cachées; 3) Les meilleures pratiques comprennent l'évitement des variables globales, l'optimisation des boucles, l'utilisation de const et de locations et d'éviter une utilisation excessive des fermetures.

Python convient plus aux débutants, avec une courbe d'apprentissage en douceur et une syntaxe concise; JavaScript convient au développement frontal, avec une courbe d'apprentissage abrupte et une syntaxe flexible. 1. La syntaxe Python est intuitive et adaptée à la science des données et au développement back-end. 2. JavaScript est flexible et largement utilisé dans la programmation frontale et côté serveur.

Python et JavaScript ont leurs propres avantages et inconvénients en termes de communauté, de bibliothèques et de ressources. 1) La communauté Python est amicale et adaptée aux débutants, mais les ressources de développement frontal ne sont pas aussi riches que JavaScript. 2) Python est puissant dans les bibliothèques de science des données et d'apprentissage automatique, tandis que JavaScript est meilleur dans les bibliothèques et les cadres de développement frontaux. 3) Les deux ont des ressources d'apprentissage riches, mais Python convient pour commencer par des documents officiels, tandis que JavaScript est meilleur avec MDNWEBDOCS. Le choix doit être basé sur les besoins du projet et les intérêts personnels.

Le passage de C / C à JavaScript nécessite de s'adapter à la frappe dynamique, à la collecte des ordures et à la programmation asynchrone. 1) C / C est un langage dactylographié statiquement qui nécessite une gestion manuelle de la mémoire, tandis que JavaScript est dynamiquement typé et que la collecte des déchets est automatiquement traitée. 2) C / C doit être compilé en code machine, tandis que JavaScript est une langue interprétée. 3) JavaScript introduit des concepts tels que les fermetures, les chaînes de prototypes et la promesse, ce qui améliore la flexibilité et les capacités de programmation asynchrones.

Différents moteurs JavaScript ont des effets différents lors de l'analyse et de l'exécution du code JavaScript, car les principes d'implémentation et les stratégies d'optimisation de chaque moteur diffèrent. 1. Analyse lexicale: convertir le code source en unité lexicale. 2. Analyse de la grammaire: générer un arbre de syntaxe abstrait. 3. Optimisation et compilation: générer du code machine via le compilateur JIT. 4. Exécuter: Exécutez le code machine. Le moteur V8 optimise grâce à une compilation instantanée et à une classe cachée, SpiderMonkey utilise un système d'inférence de type, résultant en différentes performances de performances sur le même code.

Les applications de JavaScript dans le monde réel incluent la programmation côté serveur, le développement des applications mobiles et le contrôle de l'Internet des objets: 1. La programmation côté serveur est réalisée via Node.js, adaptée au traitement de demande élevé simultané. 2. Le développement d'applications mobiles est effectué par le reactnatif et prend en charge le déploiement multiplateforme. 3. Utilisé pour le contrôle des périphériques IoT via la bibliothèque Johnny-Five, adapté à l'interaction matérielle.

J'ai construit une application SAAS multi-locataire fonctionnelle (une application EdTech) avec votre outil technologique quotidien et vous pouvez faire de même. Premièrement, qu'est-ce qu'une application SaaS multi-locataire? Les applications saas multi-locataires vous permettent de servir plusieurs clients à partir d'un chant

Cet article démontre l'intégration frontale avec un backend sécurisé par permis, construisant une application fonctionnelle EdTech SaaS en utilisant Next.js. Le frontend récupère les autorisations des utilisateurs pour contrôler la visibilité de l'interface utilisateur et garantit que les demandes d'API adhèrent à la base de rôles


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !

Dreamweaver CS6
Outils de développement Web visuel

MantisBT
Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

VSCode Windows 64 bits Télécharger
Un éditeur IDE gratuit et puissant lancé par Microsoft