Pregunta

Estoy usando Express.js (en Node.js) y sé que se puede hacer con una vista de datos personalizados a través del parámetro "locales". (res.render("template", { locals: { foo: "bar" } });)

¿Hay alguna manera de tener "globales"? (Es decir. De datos que se puede acceder a todas las vistas)

Me view options sierra, pero eso no es recursivo, por lo que sustituye a los lugareños equipo si utilizo alguna gente con mi plantilla.

Esta es mi caso de uso: Quiero hacerlo de modo que CSS / JS se puede añadir en una base por página, y que forma parte de mi diseño principal. El problema es, si no establece explícitamente aquellas matrices en cada render, me sale un error no definido, por lo que en mi plantilla siempre tengo que hacer el baile typeof css !== "undefined". Además, tengo otras listas de opciones de selección de caja que no quieren tener que agregar explícitamente a cada una de mis formas.

¿Fue útil?

Solución

Es digno de mención para aquellos que pueden haber llegado a través de esta pregunta desde el lanzamiento de Express 3, que el método de 'dynamicHelpers' ya no existe.

En su lugar se puede utilizar la función app.locals, que actúa como un objeto que puede almacenar valores o funciones, y luego pone a disposición de vistas. Por ejemplo: -

// In your app.js etc.
app.locals.title = "My App";
app.locals({
    version: 3,
    somefunction: function() {
        return "function result";
    }
});

// Then in your templates (shown here using a jade template)

=title
=version
=somefunction()  

// Will output

My App
3
function result

Si necesita acceder al objeto solicitud a la información tirón de, usted puede escribir una simple función-ware medio y utilizar la variable app.settings.

Por ejemplo, si está utilizando Connect-flash para dar mensajes a sus usuarios, es posible hacer algo como esto:

app.use(function(req, res, next) {
    app.set('error', req.flash('error'));
    next();
});

Lo que daría acceso al mensaje de error con = settings.error en su plantilla.

Estos temas se tratan aquí, aunque ligeramente brevemente: http://expressjs.com/api. html # app.locals

Actualización: Express 4

app.locals es ahora un simple JavaScript Object, por lo que cada propiedad tiene que ser conjunto de uno en uno.

app.locals.version = 3;
app.locals.somefunction = function() {
    return "function result";
}

res.locals proporciona exactamente la misma funcionalidad, excepto que se debe utilizar para los datos de petición-específicas en lugar de datos de aplicación. Un objeto de usuario o la configuración es un caso de uso común.

res.locals.user = req.isAuthenticated() ? req.user : null;
res.locals.userSettings = {
    backgroundColor: 'fff'
}

Otros consejos

Hay una manera de tener variables "globales" de puntos de vista, el uso de ayudantes de vista dinámico.

A partir de la guía Express.js:

app.dynamicHelpers (obj)

Vista Registros dinámica ayudantes. ayudantes de vista dinámicos son simplemente funciones que aceptan req, res, y son evaluados en el servidor instancia ante una vista se representa. El valor de retorno de esta función se convierte en la variable local es asociado con.

app.dynamicHelpers ({sesión: de función (req, res) { req.session regresar; }});

Todos los puntos de vista ahora tendría sesión por lo que los datos disponibles de sesión se pueden accede a través de session.name etc:

Se puede encontrar un ejemplo real de cómo usarlos aquí: https: // github .com / alessioalex / Nodetuts / árbol / maestro / express_samples (nodo app.js para iniciar la aplicación)

Un ejemplo del mundo real de la utilización de opciones de visualización como el autor menciona:

var app = express.createServer();

app.configure(function() {
  app.set('views', path.join(__dirname, '..', 'views'));
  app.set('view engine', 'jade');
  app.set('view options', {
    assetVersion: 1
  });

Y luego en mi layout.jade (plantilla base para la aplicación en mi caso):

link(rel='stylesheet', href='/static/css/' + assetVersion + '/style.css')
script(src='/static/js/' + assetVersion + '/script.js')

Con este pequeño truco, sólo tiene que actualizar la variable assetVersion un solo lugar para asegurarse de que mis activos no se almacenan en caché en barnices y otros lugares.

Me terminó buscando en el código fuente, y de hecho, me he encontrado que esto es ahora posible en quienes nunca versiones de Express. (Hasta el momento, sólo están disponibles a través de GitHub)

La forma más sencilla de lograr esto es crear una variable que representa al conjunto predeterminado de locales para sus puntos de vista. A continuación, crear una función que acepta un objeto, que se fusiona con la gente local, y devuelve el objeto resultante de la fusión.

También pasar todos mis vecinos dentro de un objeto contenedor es decir {locals:{g:{prop:val}}} por lo que en mi punto de vista puedo refernce g.prop que acaba de regresar null cuando no se ha establecido, en vez de lanzar un error indefinido.

function default_page_vars(custom_vars){
    var vars = {
        footer: true,
        host: req.headers.host.split(':')[0],
        config: this.config
    };

    if(custom_vars){
        for(var k in custom_vars){
            vars[k] = custom_vars[k];
        }
    }
    return {
        g:vars
    };
}

//within your handler
response.render(view, {
    locals: default_page_vars(other_locals)
});

Esta es una respuesta enterrado, pero finalmente lo consiguió al trabajo.

1) Este es un ejemplo alrededor del módulo connect-flash

2) Añadir una pieza de middleware en server.js / app.js añadir req a locals. Esto permite que la plantilla para request.flash() llamada cada vez que necesita. Sin esto, flash() se consume en cada petición / redirección de derrotar el propósito.

var app = module.exports = express()
  , flash=require('connect-flash');
app.configure(function(){
  ...
  app.use(express.session({ secret: "shhh" }));

  // Start Router
  app.use(flash());
  app.use(function(req, res, next) {
    res.locals.request = req;
    next();
  });

  app.use(app.router);
});

3) Configuración de su ruta de forma normal (esto es CoffeeScript, pero nada especial)

app.get '/home', (req, res) ->
  req.flash "info", "this"
  res.render "#{__dirname}/views/index"

4) request.flash de llamadas () cuando se desea que los mensajes. Se consumen en cada llamada, así que no CONSOLE.LOG ellos o se irán: -)

!!!
html
  head
    title= config.appTitle
    include partials/_styles

  body
    include partials/_scripts

    #header
      a(href="/logout") Logout CURRENTUSER
      h2= config.appTitle

    #messages
      - var flash = request.flash()
      each flashType in ['info','warn','error']
        if flash[flashType]
          p.flash(class=flashType)
            = flash[flashType]


    block content
      h1 content here

Express 4

Se puede acceder a las variables locales en las plantillas prestados dentro de la aplicación.

Por lo tanto, si desea utilizar alguna gente en su plantilla => suponiendo que tiene un motor de plantillas NPM instalado a su nodo / expresar aplicación.

En primer lugar, es necesario establecer el expresan locales objetos con su aduana variables en el archivo de app.js, se puede utilizar un objeto si se necesitan múltiples valores (en nuestro caso este post)

 /**
  *  Set locals object
  */

 app.locals.layoutData = { 
  site: {
      title: 'MyWebSiteTitle',
  },   
  metaTag: {
      charset: 'UTF-8',
      description: 'MyDescription',
      keywords: 'keyword-1,keyword-2,...',
      author: 'MyName',
      viewport: 'width=device-width, initial-scale=1.0'
  }
 };

A continuación, para acceder a los valores en el archivo de plantilla layout.pug (en el caso del motor de plantillas PUG por ejemplo)

doctype html
html
  head
    //title
    title #{locals.layoutData.site.title}
    //Describe metadata
    meta(charset=layoutData.metaTag.charset)
    meta(name='description', content=locals.layoutData.metaTag.description)
    meta(name='keywords', content=locals.layoutData.metaTag.keywords)
    meta(name='author', content=locals.layoutData.metaTag.author)
    meta(name='viewport', content=locals.layoutData.metaTag.viewport)
  body
      block content
      br
      hr
      footer
        p All rights reserved © 2018 |  #{locals.layoutData.site.title}

Probado con

  "dependencies": {
    "express": "^4.16.3",
    "pug": "^2.0.3"
  }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top