2012-03-19 12 views
7

Pochodzę z pliku express.js, chcę dać flatiron wypróbować mały projekt. Są jednak pewne drobne problemy, które uniemożliwiają mi dotarcie.routing flatiron.js i tworzenie szablonów za pomocą związków, reżyserów i tablic?

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'); 
}); 

Jak działa routing z reżyserem? Kiedy wychodzę z ecstatic, mogę zdefiniować trasy takie jak "/" i to działa, ale wtedy nie otrzymam statycznej zawartości CSS i JS. Z ekstatycznym/jest zamieniany na "index.html", a ekstatyczny ma priorytet nad wszystkimi zdefiniowanymi trasami. - To samo zachowanie w przypadku połączenia statycznego. Route (/) zostaje zastąpione przez index.html.

Próbowałem też inne podejście używając connect middleware, który nie działa:

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'); 
}); 

Odpowiedz

4

myślę najlepszą odpowiedź na pytanie o routingu w flatiron jest, jak zawsze, wewnątrz kodu źródłowego:

 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 
    }); 

Jak widać tutaj Flatiron wiąże router jako ostatniego żądania obsługi, która jest wywoływana po wszystkim middleware. Jeśli umieścisz "ekstatyczne" w app.http.before i zostanie ono wysłane podczas przepływu pracy, żadne inne oprogramowanie pośrednie nie zostanie wywołane.

Twój drugi blok kodu pokazuje, że nie zmieniasz różnicy między metodą Flat .iron (Flatiron) z Express/Connect. Postaram się jasno na ten przykład:

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

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

Jeśli chcesz użyć middleware połączyć w Flatiron należy ją umieścić odpowiednio w app.http.before tablicy tak:

// 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') 
    ] 
}); 

zapomniałem włożyć dispatch-funkcji. To działa.

+0

Dzięki dla ustalenia tego. To jest takie dziwne i słabo udokumentowane! –

+0

Dzięki za opublikowanie tego, przegapiłem część connect.static(). – Zacho