2012-03-19 8 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のコンテンツは取得されません。 ecstatic /は 'index.html'に置き換えられ、すべての定義されたルートよりも歓喜が優先されます。 - connect-staticと同じ動作です。ルート(/)はindex.htmlに置き換えられます。

Iはまた、動作しない接続ミドルウェアを使用して別のアプローチを試みた:

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に 'ecstatic'を配置し、ワークフロー中にディスパッチされると、他のミドルウェアは呼び出されません。

コードの2番目のブロックは、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(); 
    }) 

あなたはフラットアイアンにConnectのミドルウェアを使用したい場合は、このような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') 
    ] 
}); 

Iがディスパッチ機能を挿入するのを忘れました。これは機能します。

+0

感謝これを理解するために。これは非常に奇妙で、文書化されていません! –

+0

投稿していただきありがとうございます。私はconnect.static()の部分を見逃しました。 – Zacho