首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用工会、导向器和模板的flatiron.js路由和模板?

使用工会、导向器和模板的flatiron.js路由和模板?
EN

Stack Overflow用户
提问于 2012-03-19 16:39:38
回答 2查看 1.9K关注 0票数 7

我来自express.js,我想尝试一下flatiron的一个小项目。然而,有一些小问题阻碍了我的实际进展。

代码语言:javascript
复制
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‘,并且ecstatic优先于所有定义的路由。-与connect-static的行为相同。路由(/)替换为index.html。

我还使用connect中间件尝试了一种不同的方法,但不起作用:

代码语言:javascript
复制
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');
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-27 03:09:08

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

代码语言:javascript
复制
     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
     });

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

您的第二段代码表明您不理解Flatiron的.use()方法与Express/Connect方法之间的区别。

代码语言:javascript
复制
    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数组中,如下所示:

代码语言:javascript
复制
    // Initiating application
    app.use(flatiron.plugins.http);

    // Adding request handlers
    app.http.before.push( connect.favicon() );
    app.http.before.push( ecstatic(__dirname + '/public') );
票数 4
EN

Stack Overflow用户

发布于 2012-03-19 23:02:07

代码语言:javascript
复制
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')
  ]
});

我忘了插入调度函数。这是可行的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9767099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档