flatiron.js маршрутизация и создание шаблонов с объединением, директором и тарелками? - PullRequest
7 голосов
/ 19 марта 2012

Исходя из 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. Экстатический / заменяется на index.html, а экстатический имеет приоритет над всеми определенными маршрутами. - Такое же поведение с 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');
});

Ответы [ 2 ]

4 голосов
/ 26 марта 2012

Я думаю, что лучший ответ на ваш вопрос о маршрутизации во 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
     });

Как вы видите здесь, flatiron связывает маршрутизатор как последний обработчик запросов, который вызывается после всего промежуточного программного обеспечения. Если вы поместите «восторженный» в app.http.before и он будет отправлен во время рабочего процесса, никакое другое промежуточное программное обеспечение не будет вызываться.

Ваш второй блок кода демонстрирует, что вы не понимаете различий между методом Flaeron's .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();
    })

Если вы хотите использовать промежуточное программное обеспечение Connect во Flatiron, вы должны поместить его соответственно в массив 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 голосов
/ 19 марта 2012
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')
  ]
});

Я забыл вставить функцию отправки. Это работает.

...