flatiron.js路由和模板与工会,董事和板块?

来自express.js,我想给flatiron一个小项目的尝试。 但是,有一些小问题让我无法到达某个地方。

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

导演如何工作? 当我离开狂喜时,我可以定义像“/”这样的路线,它可以工作,但是我没有得到静态的CSS和JS内容。 欣喜若狂/被replace为'index.html',狂喜优先于所有定义的路线。 – 这是与连接静态相同的行为。 路由(/)被index.html所取代。

我也尝试了使用连接中间件的不同方法,

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

我认为你的关于在flatiron路由的问题的最佳答案是一如既往,在源代码内:

  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中放置'狂喜',它将在工作stream程中被调度,不会有其他中间件被调用。

你的第二块代码演示了你不会忽略来自Express / Connect的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(); }) 

如果你想在Flatiron中使用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') ); 
 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') ] }); 

我忘了插入调度function。 这工作。