2012-03-19 32 views
7

來自express.js,我想給flatiron嘗試一個小項目。但是,有一些小問題阻止我實際上到達某個地方。flatiron.js路由和聯盟,董事和板塊的模板?

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

如何使用導向器工作?當我離開ecstatic時,我可以定義像'/'這樣的路線,它可以工作,但是我沒有得到靜態的CSS和JS內容。欣喜若狂/被替換爲'index.html',狂喜優先於所有定義的路線。 - 這與連接靜態相同。路由(/)被index.html替換。

我也嘗試使用connect中間件,它不工作了不同的方法:

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

回答

4

我覺得你的問題的最佳答案大約在烙鐵路由,一如既往,裏面的源代碼:

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

正如你可以在這裏看到烙鐵結合路由器作爲最後一個請求處理程序,即所謂的畢竟中間件。如果您將'狂喜'放在app.http.before中,並且它將在工作流程中分派,則不會調用其他中間件。

你的第二塊代碼表明你不會忽略來自Express/Connect's的Flatiron的.use()方法之間的差異。我會盡量做到在這個例子清楚:

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

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

如果你想使用連接在熨斗中間件應該分別放置這樣app.http.before數組中:

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

我忘了插入調度功能。這工作。

+0

謝謝爲了弄清楚這一點。這太奇怪了,記錄不完整! – 2012-06-20 05:16:17

+0

感謝張貼,我錯過了connect.static()部分。 – Zacho 2012-07-09 16:29:46