world tutorial proyecto node how hello crear node.js express

tutorial - MĂșltiples rutas de vista en Node.js+Express



node js express tutorial (4)

Estoy escribiendo un CMS en Node.js con Express Framework . En mi CMS tengo varios módulos para usuarios, páginas, etc.

Quiero que cada módulo tenga sus archivos en una carpeta separada , incluidos los archivos de vista . Alguien sabe cómo puedo lograr eso?

Estoy usando Swig como mi motor de plantilla, pero puedo reemplazarlo por otro si es útil.


Además de la respuesta @ user85461, la parte de vista requerida no funcionó para mí. Lo que hice: eliminé el material del camino y lo moví a un módulo que podría necesitar, patch.ViewEnableMultiFolders.js (funciona con el sistema express actual):

function ViewEnableMultiFolders(app) { // Monkey-patch express to accept multiple paths for looking up views. // this path may change depending on your setup. var lookup_proxy = app.get(''view'').prototype.lookup; app.get(''view'').prototype.lookup = function(viewName) { var context, match; if (this.root instanceof Array) { for (var i = 0; i < this.root.length; i++) { context = {root: this.root[i]}; match = lookup_proxy.call(context, viewName); if (match) { return match; } } return null; } return lookup_proxy.call(this, viewName); }; } module.exports.ViewEnableMultiFolders = ViewEnableMultiFolders;

y usado:

var Patch = require(''patch.ViewEnableMultiFolders.js''); Patch.ViewEnableMultiFolders(app); app.set(''views'', [''./htdocs/views'', ''/htdocs/tpls'']);


Aquí hay una solución para Express 3.x. Los parches de mono expresan el objeto "Ver" de 3.x para hacer el mismo truco de búsqueda que la solución de @SombraCloud anterior. Desafortunadamente, la búsqueda de ruta para el objeto View está menos limpia, ya que 3.x no lo expone a express , por lo que debe cavar en las entrañas de node_modules.

function enable_multiple_view_folders() { // Monkey-patch express to accept multiple paths for looking up views. // this path may change depending on your setup. var View = require("./node_modules/express/lib/view"), lookup_proxy = View.prototype.lookup; View.prototype.lookup = function(viewName) { var context, match; if (this.root instanceof Array) { for (var i = 0; i < this.root.length; i++) { context = {root: this.root[i]}; match = lookup_proxy.call(context, viewName); if (match) { return match; } } return null; } return lookup_proxy.call(this, viewName); }; } enable_multiple_view_folders();


Sin embargo, puede poner todos los archivos de vista dentro de la carpeta ''ver'', pero separar la vista de cada módulo en sus propias carpetas dentro de la carpeta ''ver''. Entonces, la estructura es algo como esto:

views --moduleA --moduleB ----submoduleB1 ----submoduleB2 --moduleC

Establezca los archivos de vista como de costumbre:

app.set(''views'', ''./views'');

Y cuando se rinda para cada módulo, incluya el nombre del módulo:

res.render(''moduleA/index'', ...);

o incluso el nombre del submódulo:

res.render(''moduleB/submoduleB1/index'', ...);

Esta solución también funciona en Express antes de la versión 4.x,


Última actualización

La característica de carpetas de vista múltiple es compatible con el marco de trabajo desde Express 4.10

Simplemente pase una serie de ubicaciones a la propiedad de views , como tal.

app.set(''views'', [__dirname + ''/viewsFolder1'', __dirname + ''/viewsFolder2'']);

Express 2.0

Por lo que sé, Express no admite múltiples rutas de vista o espacios de nombres en este momento (como el middleware estático do)

Pero usted mismo puede modificar la lógica de búsqueda para que funcione de la manera que desee, por ejemplo:

function enableMultipleViewFolders(express) { // proxy function to the default view lookup var lookupProxy = express.view.lookup; express.view.lookup = function (view, options) { if (options.root instanceof Array) { // clones the options object var opts = {}; for (var key in options) opts[key] = options[key]; // loops through the paths and tries to match the view var matchedView = null, roots = opts.root; for (var i=0; i<roots.length; i++) { opts.root = roots[i]; matchedView = lookupProxy.call(this, view, opts); if (matchedView.exists) break; } return matchedView; } return lookupProxy.call(express.view, view, options) }; }

Habilitará la nueva lógica llamando a la función anterior y pasando el parámetro express , y luego podrá especificar una matriz de vistas para la configuración:

var express = require(''express''); enableMultipleViewFolders(express); app.set(''views'', [__dirname + ''/viewsFolder1'', __dirname + ''/viewsFolder2'']);

O, si lo prefiere, puede aplicar un parche al marco directamente (actualizando el archivo view.js dentro de él)

Esto debería funcionar en Express 2.x , no estoy seguro si lo hará con la nueva versión (3.x)

ACTUALIZAR

Desafortunadamente, la solución anterior no funcionará en Express 3.x ya que express.view no estaría definido

Otra solución posible será utilizar la función response.render y establecer la configuración de las carpetas de vistas hasta que coincida:

var renderProxy = express.response.render; express.render = function(){ app.set(''views'', ''path/to/custom/views''); try { return renderProxy.apply(this, arguments); } catch (e) {} app.set(''views'', ''path/to/default/views''); return renderProxy.apply(this, arguments); };

No lo he probado, de todos modos me parece muy raro, desafortunadamente esta característica ha sido rechazada de nuevo: https://github.com/visionmedia/express/pull/1186

ACTUALIZACIÓN 2

Esta característica se ha agregado en Express 4.10, ya que la siguiente solicitud de extracción se ha fusionado: https://github.com/strongloop/express/pull/2320