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. Экстатический / заменяется на "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 ответа
Я думаю, что лучший ответ на ваш вопрос о маршрутизации в 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 и он будет отправлен во время рабочего процесса, никакое другое промежуточное программное обеспечение не будет вызываться.
Ваш второй блок кода демонстрирует, что вы не понимаете различий между методом.ti () Flatiron и 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') );
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')
]
});
Я забыл вставить диспетчерскую функцию. Это работает.