我来自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');
});指挥交换机的路由是如何工作的?当我省略ecstatic的时候,我可以定义像'/‘这样的路由,它可以工作,但是我不能得到静态的CSS和JS内容。使用ecstatic /替换为'index.html‘,并且ecstatic优先于所有定义的路由。-与connect-static的行为相同。路由(/)替换为index.html。
我还使用connect中间件尝试了一种不同的方法,但不起作用:
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');
});发布于 2012-03-27 03:09:08
我认为对于你关于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绑定路由器作为最后一个请求处理程序,它在所有中间件之后被调用。如果您将“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();
})如果你想在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') );发布于 2012-03-19 23:02:07
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')
]
});我忘了插入调度函数。这是可行的。
https://stackoverflow.com/questions/9767099
复制相似问题