Acceso a la variable mountpath desde una plantilla usando Express

¿Existe una forma limpia y recomendada de acceder a la ruta de assembly desde una plantilla, de modo que una aplicación Express se pueda ejecutar de forma independiente y como parte de otra aplicación (mediante app.use), con las rutas que apuntan al destino correcto? ¿camino?

Algo como:

{{mountpath}}route/to/file 

Entonces, en el caso de que la aplicación se ejecute de forma independiente, mountpath será / , y en caso de que se ejecute como un submódulo, mountpath podría ser /foo/

Nota: estoy utilizando manillares.

Express.static middleware es responsable de servir los activos estáticos de una aplicación Express. Cómo funciona:

  • Servir contenido estático para la aplicación desde el directorio “público” en el directorio de la aplicación

    // GET /style.css etc

    app.use (express.static (__ dirname + ‘/ public’));

  • Monte el middleware en “/ static” para servir contenido estático solo cuando su ruta de solicitud tiene el prefijo “/ static”

    // GET /static/style.css etc.

    app.use (‘/ static’, express.static (__ dirname + ‘/ public’));

  • Servir archivos estáticos de varios directorios, pero dar prioridad a “./public” sobre los demás

    app.use (express.static (__ dirname + ‘/ public’));

    app.use (express.static (__ dirname + ‘/ files’));

    app.use (express.static (__ dirname + ‘/ uploads’));

En su caso puede utilizar el segundo caso, es decir; monta los archivos en la ruta ‘/ static’, por lo que cualquier archivo que se encuentre bajo la carpeta pública puede ser accesos con src = ‘/ static / filename.xyz’ Crea una carpeta pública con subcarpetas css, js, imágenes O si quieres tu css para ser montado en path /css entonces haces:

 app.use('/css',express.static(path.join(__dirname, 'module1/css'))); 

Ahora puedes usar todos tus archivos css en toda tu aplicación como:

   

Hay un evento que se activa después de montar el módulo , así que puedo hacer:

 app.locals.modulePath = "/"; app.on('mount', function (parent) { app.locals.modulePath = app.mountpath; }); 

Se puede acceder directamente a los locales desde todas las vistas, por lo que será accesible como {{modulePath}}

Tuve el mismo problema: necesitaba usar mountpath desde una plantilla.

La solución que me funciona está basada en 2 hechos.

  1. mountpath está disponible en la solicitud – req.baseUrl
  2. El objeto local de respuesta se exporta a la plantilla – res.locals

Primero, cree un middleware de una línea: esto se aplicará a todas las rutas dentro del módulo / subapp

 router.use(function (req, res, next) { res.locals.baseUrl = req.baseUrl; next(); }); 

Luego, dentro de la plantilla, use #{baseUrl}/some/route : tenga en cuenta que esta es la syntax de jade, pero supongo que funciona de la misma manera con los manillares.