flatiron.js使用union,director和plate进行路由和模板化?

Pat*_*ick 7 javascript url-routing node.js flatiron.js

来自express.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');
});
Run Code Online (Sandbox Code Playgroud)

如何使用导演工作?当我离开狂喜时,我可以定义像'/'这样的路线并且它可以工作,但是我没有得到静态的CSS和JS内容.使用ecstatic /替换为'index.html',并且ecstatic优先于所有已定义的路线. - 这与connect-static的行为相同.路径(/)由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');
});
Run Code Online (Sandbox Code Playgroud)

Dmi*_*hev 4

我认为关于 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
     });
Run Code Online (Sandbox Code Playgroud)

正如您在这里看到的,Flatiron 将路由器绑定为最后一个请求处理程序,在所有中间件之后调用。如果您将“ecstatic”放在 app.http.before 中,并且它将在工作流程期间调度,则不会调用其他中间件。

您的第二个代码块表明您不理解 Flatiron 的 .use() 方法与 Express/Connect 的方法之间的区别。我将尝试通过这个例子来阐明:

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

    connectApp.use(function(req, res, next) {
      /* code */
      next();
    })
Run Code Online (Sandbox Code Playgroud)

如果你想在 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') );
Run Code Online (Sandbox Code Playgroud)