85 votes

Comment créer des variables globales accessibles dans toutes les vues en utilisant Express / Node.JS ?

Ok, j'ai donc créé un blog en utilisant Jekyll et vous pouvez définir des variables dans un fichier _config.yml qui sont accessibles dans tous les modèles/présentations. J'utilise actuellement Node.JS / Express con EJS modèles et ejs-locals (pour les partiels/maquettes. Je cherche à faire quelque chose de similaire aux variables globales comme site.title qui se trouvent dans _config.yml si quelqu'un connaît Jekyll. J'ai des variables comme le titre du site (plutôt que le titre de la page), le nom de l'auteur/de la société, qui restent les mêmes sur toutes mes pages.

Voici un exemple de ce que je fais actuellement.. :

exports.index = function(req, res){
    res.render('index', { 
        siteTitle: 'My Website Title',
        pageTitle: 'The Root Splash Page',
        author: 'Cory Gross',
        description: 'My app description',
        indexSpecificData: someData
    });
};

exports.home = function (req, res) {
    res.render('home', {
        siteTitle: 'My Website Title',
        pageTitle: 'The Home Page',
        author: 'Cory Gross',
        description: 'My app description',
        homeSpecificData: someOtherData
    });
};

J'aimerais pouvoir définir des variables comme le titre de mon site, la description, l'auteur, etc. en un seul endroit et les rendre accessibles dans mes layouts/templates via EJS sans avoir à les passer en tant qu'options à chaque appel de res.render . Existe-t-il un moyen de faire cela tout en me permettant de passer d'autres variables spécifiques à chaque page ?

0voto

Gajen Sunthara Points 9

Une façon d'y parvenir est de mettre à jour le app.locals pour cette application dans app.js

Régler par le biais de ce qui suit

var app = express();
app.locals.appName = "DRC on FHIR";

Obtenir / Accéder

app.listen(3000, function () {
    console.log('[' + app.locals.appName + '] => app listening on port 3001!');
});

Elaborer avec une capture d'écran de l'exemple de @RamRovi avec une légère amélioration.

enter image description here

0voto

Juan - 6510866 Points 66

Avec les différentes réponses, j'ai implémenté ce code pour utiliser un fichier externe JSON chargé dans "app.locals"

Paramètres

{
    "web": {
        "title" : "Le titre de ma Page",
        "cssFile" : "20200608_1018.css"
    }
}

Application

var express     = require('express');
var appli       = express();
var serveur     = require('http').Server(appli);

var myParams    = require('./include/my_params.json');
var myFonctions = require('./include/my_fonctions.js');

appli.locals = myParams;

Page EJS

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <title><%= web.title %></title>
    <link rel="stylesheet" type="text/css" href="http://stackoverflow.com/css/<%= web.cssFile %>">
</head>

</body>
</html>

En espérant que cela vous aidera

-1voto

dewwwald Points 179

Pour éviter de polluer la portée globale, je crée un script que je peux inclure n'importe où.

// my-script.js
const ActionsOverTime = require('@bigteam/node-aot').ActionsOverTime;
const config = require('../../config/config').actionsOverTime;
let aotInstance;

(function () {
  if (!aotInstance) {
    console.log('Create new aot instance');
    aotInstance = ActionsOverTime.createActionOverTimeEmitter(config);
  }
})();

exports = aotInstance;

Cela ne créera une nouvelle instance qu'une seule fois et la partagera partout où le fichier est inclus. Je ne sais pas si c'est parce que la variable est mise en cache ou si c'est à cause d'un mécanisme de référence interne à l'application (qui pourrait inclure la mise en cache). Tout commentaire sur la façon dont node résout ce problème serait le bienvenu.

Vous pouvez également lire ceci pour avoir une idée de la manière dont les exigences fonctionnent : http://fredkschott.com/post/2014/06/require-and-the-module-system/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X