2012-03-19 15 views
7

Đến từ express.js, tôi muốn cung cấp cho flatiron một thử cho một dự án nhỏ. Tuy nhiên, có một số vấn đề nhỏ khiến tôi không thực sự đi đâu đó.flatiron.js định tuyến và templating với công đoàn, giám đốc và tấm?

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

Định tuyến với giám đốc hoạt động như thế nào? Khi tôi rời khỏi ecstatic, tôi có thể xác định các tuyến đường như '/' và nó hoạt động, nhưng sau đó tôi không nhận được nội dung CSS và JS tĩnh. Với ngây ngất/được thay thế bằng 'index.html' và ngây ngất có ưu tiên trên tất cả các tuyến đường được xác định. - Đó là hành vi tương tự với kết nối tĩnh. Route (/) được thay thế bằng index.html.

Tôi cũng đã cố gắng một cách tiếp cận khác nhau bằng cách sử dụng kết nối trung gian, mà không làm việc:

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

Trả lời

4

Tôi nghĩ câu trả lời tốt nhất cho câu hỏi của bạn về định tuyến trong Flatiron là, như mọi khi, bên trong mã nguồn:

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

Như bạn có thể thấy ở đây Flatiron liên kết router như xử lý yêu cầu cuối cùng, đó được gọi là sau tất cả phần mềm trung gian. Nếu bạn đặt 'ngây ngất' trong app.http.before và nó sẽ được gửi đi trong tiến trình công việc, không có phần mềm trung gian nào khác được gọi.

Khối mã thứ hai của bạn chứng minh rằng bạn không đánh dấu sự khác biệt giữa phương thức .use() của Flatiron từ Express/Connect's. Tôi sẽ cố gắng để làm cho nó rõ ràng về ví dụ này:

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

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

Nếu bạn muốn sử dụng middleware Connect trong Flatiron bạn nên đặt nó tương ứng trong app.http.before mảng như thế này:

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

Tôi quên để chèn dispatch-chức năng. Những công việc này.

+0

Cảm ơn để tìm ra điều này. Điều này thật kỳ lạ và kém tài liệu! –

+0

Cảm ơn bạn đã đăng bài, tôi đã bỏ lỡ phần connect.static(). – Zacho

Các vấn đề liên quan