2012-03-19 11 views
7

Viniendo de express.js, quiero probar flatiron para un proyecto pequeño. Sin embargo, hay algunos pequeños problemas que me impiden llegar a algún lado.flatiron.js enrutamiento y creación de plantillas con unión, director y placas?

var flatiron = require('flatiron') 
, session = require('connect').session 
, ecstatic = require('ecstatic') 
, path = require('path') 
, fs = require('fs') 
, plates = require('plates') 
, director = require('director') 
, winston = require('winston') 
, union = require('union'); 

var router = new director.http.Router(); 
var server = union.createServer({ 
    before: [ 
    ecstatic(__dirname + '/public') 
    ] 
}); 

router.get('/', function() { 
    var self = this; 
    fs.readFile('public/layout.html', 'utf-8', function(err, html) { 
    [...] 
    }) 
}); 

server.listen(3000, function() { 
    console.log('Application is now started on port 3000'); 
}); 

¿Cómo funciona el enrutamiento con el director? Cuando salgo de ecstatic, puedo definir rutas como '/' y funciona, pero luego no obtengo contenido estático de CSS y JS. Con extático/se reemplaza con 'index.html' y extático tiene prioridad sobre todas las rutas definidas. - Es el mismo comportamiento con connect-static. La ruta (/) se reemplaza por index.html.

También probé un enfoque diferente utilizando el middleware de conexión, que no funciona:

var flatiron = require('flatiron') 
, connect = require('connect') 
, path = require('path') 
, fs = require('fs') 
, plates = require('plates') 
, app = flatiron.app; 

app.use(flatiron.plugins.http); 
app.use(connect.favicon()); 
app.use(connect.static(__dirname + '/public')); 
app.use(connect.directory(__dirname + '/public')); 
app.use(connect.cookieParser('my secret here')); 
app.use(connect.session({'secret': 'keyboard cat'})); 

app.router.get('/', function() { 
    console.log("GET /"); 
    var self = this; 
    fs.readFile('public/layout.html', 'utf-8', function(err, html) { 
    [...] 
    }) 
}); 

app.listen(3000, function() { 
    console.log('Application is now started on port 3000'); 
}); 

Respuesta

4

Creo que la mejor respuesta a su pregunta sobre el enrutamiento en plancha de hierro es, como siempre, dentro del código fuente:

 app.server = union.createServer({ 
      after: app.http.after, 
      before: app.http.before.concat(function (req, res) { 
      if (!app.router.dispatch(req, res, app.http.onError || union.errorHandler)) { 
       if (!app.http.onError) res.emit('next'); 
      } 
      }), 
      headers: app.http.headers, 
      limit: app.http.limit 
    }); 

Como se puede ver aquí plancha de hierro se une router como el último controlador de solicitudes, que se llama después de todo el middleware. Si coloca 'extático' en la aplicación. Anterior y se enviará durante el flujo de trabajo, no se llamaría a ningún otro middleware.

Su segundo bloque de código demuestra que no entiende la diferencia entre el método .use() de Flatiron de Express/Connect. Voy a tratar de dejar claro en este ejemplo:

flatironApp.use({ 
     // plugin object 
     name : "pluginName" 
     , attach : function(options) { 
      /*code*/ 
     } 
     , init : function(done) { 
      /*code*/ 
      done(); 
     } 
    }) 

    connectApp.use(function(req, res, next) { 
     /* code */ 
     next(); 
    }) 

Si desea utilizar el middleware de Connect en Flatiron usted debe colocarlo, respectivamente, en app.http.before gama de esta manera:

// Initiating application 
    app.use(flatiron.plugins.http); 

    // Adding request handlers 
    app.http.before.push(connect.favicon()); 
    app.http.before.push(ecstatic(__dirname + '/public')); 
2
var connect = require('connect'); 

var server = union.createServer({ 
    before: [ 
    function (req, res) { 
     var found = router.dispatch(req, res); 
     if (!found) { 
      res.emit('next'); 
     } 
    }, 
    connect.static('public') 
    ] 
}); 

me olvidó insertar el despacho-función. Esto funciona.

+0

Gracias para resolver esto. ¡Esto es tan raro y está mal documentado! –

+0

Gracias por publicar eso, me perdí la parte connect.static(). – Zacho

Cuestiones relacionadas