Saltar al contenido

¿Cómo crear variables globales accesibles en todas las vistas usando Express / Node.JS?

Queremos compartir contigo la mejor respuesta que encontramos en línea. Nosotros queremos que te resulte de ayuda y si deseas compartir algo que nos pueda ayudar a mejorar hazlo libremente.

Después de tener la oportunidad de estudiar el Referencia de la API de Express 3 un poco más descubrí lo que buscaba. Específicamente las entradas para app.locals y luego un poco más abajo res.locals tenía las respuestas que necesitaba.

Descubrí por mí mismo que la función app.locals toma un objeto y almacena todas sus propiedades como variables globales dentro del ámbito de la aplicación. Estos globales se pasan como variables locales a cada vista. La función res.locals, sin embargo, tiene como alcance la solicitud y, por lo tanto, las variables locales de respuesta son accesibles solo para las vistas representadas durante esa solicitud / respuesta en particular.

Entonces para mi caso en mi app.js lo que hice fue agregar:

app.locals(
    site: 
        title: 'ExpressBootstrapEJS',
        description: 'A boilerplate for a simple web application with a Node.JS and Express backend, with an EJS template with using Twitter Bootstrap.'
    ,
    author: 
        name: 'Cory Gross',
        contact: '[email protected]'
    
);

Entonces todas estas variables son accesibles en mis vistas como site.title, site.description, author.name, author.contact.

También podría definir variables locales para cada respuesta a una solicitud con res.locals, o simplemente pase variables como el título de la página como el optionsparámetro en el render llamar.

EDITAR: Este método no le permite utilizar estos locales en su middleware. De hecho, me encontré con esto como sugiere Pickels en el comentario a continuación. En este caso, deberá crear una función de middleware como tal en su respuesta alternativa (y apreciada). Su función de middleware deberá agregarlos a res.locals para cada respuesta y luego llame next. Esta función de middleware deberá colocarse por encima de cualquier otro middleware que necesite utilizar estos locales.

EDITAR: Otra diferencia entre declarar a los lugareños a través de app.locals y res.locals es eso con app.locals las variables se establecen una sola vez y persisten durante toda la vida de la aplicación. Cuando estableces locales con res.locals en su middleware, estos se establecen cada vez que recibe una solicitud. Básicamente, debería preferir configurar globales a través de app.locals a menos que el valor dependa de la solicitud req variable pasada al middleware. Si el valor no cambia, será más eficiente que se establezca solo una vez en app.locals.

Puede hacer esto agregándolos al objeto locals en un middleware general.

app.use(function (req, res, next) 
   res.locals = 
     siteTitle: "My Website's Title",
     pageTitle: "The Home Page",
     author: "Cory Gross",
     description: "My app's description",
   ;
   next();
);

Locals también es una función que extenderá el objeto locals en lugar de sobrescribirlo. Entonces lo siguiente también funciona

res.locals(
  siteTitle: "My Website's Title",
  pageTitle: "The Home Page",
  author: "Cory Gross",
  description: "My app's description",
);

Ejemplo completo

var app = express();

var middleware = 

    render: function (view) 
        return function (req, res, next) 
            res.render(view);
        
    ,

    globalLocals: function (req, res, next) 
        res.locals( 
            siteTitle: "My Website's Title",
            pageTitle: "The Root Splash Page",
            author: "Cory Gross",
            description: "My app's description",
        );
        next();
    ,

    index: function (req, res, next) 
        res.locals(
            indexSpecificData: someData
        );
        next();
    

;


app.use(middleware.globalLocals);
app.get('/', middleware.index, middleware.render('home'));
app.get('/products', middleware.products, middleware.render('products'));

También agregué un middleware de renderizado genérico. De esta manera, no tiene que agregar res.render a cada ruta, lo que significa que tiene una mejor reutilización del código. Una vez que siga la ruta del middleware reutilizable, notará que tendrá muchos bloques de construcción que acelerarán enormemente el desarrollo.

Para Express 4.0, descubrí que el uso de variables de nivel de aplicación funciona de manera un poco diferente y la respuesta de Cory no funcionó para mí.

De los documentos: http://expressjs.com/en/api.html#app.locals

Descubrí que se podía declarar una variable global para la aplicación en

app.locals

p.ej

app.locals.baseUrl = "http://www.google.com"

Y luego en su aplicación puede acceder a estas variables y en su middleware express puede acceder a ellas en el objeto req como

req.app.locals.baseUrl

p.ej

console.log(req.app.locals.baseUrl)
//prints out http://www.google.com

Comentarios y calificaciones del tutorial

Si estás contento con lo expuesto, tienes la libertad de dejar un ensayo acerca de qué te ha gustado de esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *